// Purpose. Template Method design pattern // 1. Standardize the skeleton of an algorithm in a base class "template" method // 2. Common implementations of individual steps are defined in the base class // 3. Steps requiring peculiar implementations are "placeholders" in base class // 4. Derived classes can override placeholder methods // 5. Derived classes can override implemented methods // 6. Derived classes can override and "call back to" base class methods abstract class Generalization { // 1. Standardize the skeleton of an algorithm in a "template" method public void findSolution() { stepOne(); stepTwo(); stepThr(); stepFor(); } // 2. Common implementations of individual steps are defined in base class protected void stepOne() { System.out.println( "Generalization.stepOne" ); } // 3. Steps requiring peculiar impls are "placeholders" in the base class abstract protected void stepTwo(); abstract protected void stepThr(); protected void stepFor() { System.out.println( "Generalization.stepFor" ); } } abstract class Specialization extends Generalization { // 4. Derived classes can override placeholder methods // 1. Standardize the skeleton of an algorithm in a "template" method protected void stepThr() { step3_1(); step3_2(); step3_3(); } // 2. Common implementations of individual steps are defined in base class protected void step3_1() { System.out.println( "Specialization.step3_1" ); } // 3. Steps requiring peculiar impls are "placeholders" in the base class abstract protected void step3_2(); protected void step3_3() { System.out.println( "Specialization.step3_3" ); } } class Realization extends Specialization { // 4. Derived classes can override placeholder methods protected void stepTwo() { System.out.println( "Realization .stepTwo" ); } protected void step3_2() { System.out.println( "Realization .step3_2" ); } // 5. Derived classes can override implemented methods // 6. Derived classes can override and "call back to" base class methods protected void stepFor() { System.out.println( "Realization .stepFor" ); super.stepFor(); } } class TemplateMethodDemo { public static void main( String[] args ) { Generalization algorithm = new Realization(); algorithm.findSolution(); } } // Generalization.stepOne // Realization .stepTwo // Specialization.step3_1 // Realization .step3_2 // Specialization.step3_3 // Realization .stepFor // Generalization.stepFor