import java.util.List; import java.util.ArrayList; public abstract class DivideAndConquerSortingMachine { public final List solve(List problem) { List> subProblems; if (isSimple(problem)) { return simplySolve(problem); } else { subProblems = decompose(problem); } List> subSolutions = new ArrayList>(); for (int i = 0; i < subProblems.size(); i++) { subSolutions.add(i, solve(subProblems.get(i))); } return combine(problem, subSolutions); } protected abstract boolean isSimple(List problem); protected abstract List simplySolve(List problem); protected abstract List> decompose(List problem); protected abstract List combine(List problem, List> subSolutions); }