// File Problem.java public interface Problem {} // File Solution.java public interface Solution {} // File DivConqTemplate.java abstract public class DivConqTemplate { public final Solution solve (Problem p) { Problem[] pp; if (isSimple(p)) { return simplySolve(p); } else { pp = decompose(p); } Solution[] ss = new Solution[pp.length]; for (int i = 0; i < pp.length; i++) { ss[i] = solve(pp[i]); } return combine(p,ss); } abstract protected boolean isSimple (Problem p); abstract protected Solution simplySolve (Problem p); abstract protected Problem[] decompose (Problem p); abstract protected Solution combine (Problem p, Solution[] ss); } // File DivConqContext.java public final class DivConqContext { public DivConqContext (DivConqStrategy dc) { this.dc = dc; } public Solution solve (Problem p) { Problem[] pp; if (dc.isSimple(p)) { return dc.simplySolve(p); } else { pp = dc.decompose(p); } Solution[] ss = new Solution[pp.length]; for (int i = 0; i < pp.length; i++) { ss[i] = solve(pp[i]); } return dc.combine(p, ss); } public void setAlgorithm (DivConqStrategy dc) { this.dc = dc; } private DivConqStrategy dc; } // File DivConqStrategy.java abstract public class DivConqStrategy { abstract public boolean isSimple (Problem p); abstract public Solution simplySolve (Problem p); abstract public Problem[] decompose (Problem p); abstract public Solution combine (Problem p, Solution[] ss); }