|
|
|
| 您的位置:首页>>设计模式>>[Behavioralnbsp;Patterns]nbsp;Thenbsp;Templatenbsp;Pattern |
|
|
[Behavioralnbsp;Patterns]nbsp;Thenbsp;Templatenbsp;Pattern
|
| 2007-04-13 来源:www.javaresearch.org 作者:未知 |
Intent Define the skeleton of an algorithm in an operation, deferring some steps to client subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
Problem Two different components have significant similarities, but demonstrate no reuse of common interface or implementation. If a change common to both components becomes necessary, duplicate effort must be expended.
Structure
 Steps and sequence: 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
When to use Whenever you write a parent class where you leave one or more of themethods to be implemented by derived classes, you are in essence using theTemplate pattern. The Template pattern formalizes the idea of defining analgorithm in a class, but leaving some of the details to be implemented insubclasses. In other words, if your base class is an abstract class, as oftenhappens in these design patterns, you are using a simple form of the Templatepattern.
|
|
|
| |