模板方法模式包含以下主要角色。
(1) 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型。
- 抽象方法:在抽象类中申明,由具体子类实现。
- 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
- 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
(2) 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
模板方法模式的结构图如图 1 所示。
图1 模板方法模式的结构图
代码:
package templateMethod; public class TemplateMethodPattern { public static void main(String[] args) { AbstractClass tm=new ConcreteClass(); tm.TemplateMethod(); } } //抽象类 abstract class AbstractClass { public void TemplateMethod() //模板方法 { SpecificMethod(); abstractMethod1(); abstractMethod2(); } public void SpecificMethod() //具体方法 { System.out.println("抽象类中的具体方法被调用..."); } public abstract void abstractMethod1(); //抽象方法1 public abstract void abstractMethod2(); //抽象方法2 } //具体子类 class ConcreteClass extends AbstractClass { public void abstractMethod1() { System.out.println("抽象方法1的实现被调用..."); } public void abstractMethod2() { System.out.println("抽象方法2的实现被调用..."); } }
例子:
//模板方法设计模式: //父类定义一个操作算法中的框架,而将其中的一些步骤延迟加载到子类中。 //它的本质就是固定算法框架。 //模板类 abstract class OperatorTimeTemplate { public final long totalTime() { long begin = System.currentTimeMillis(); doWork(); long end = System.currentTimeMillis(); return end - begin; } abstract void doWork();//模板方法 } // 类 StringOperator 继承自 Template class StringOperator extends OperatorTimeTemplate { void doWork() { String str = ""; for(int i=0; i<100000; ++i) { str += 1; } } } // 类 IntOperator 继承自 Template class IntOperator extends OperatorTimeTemplate { void doWork() { int sum = 0; for(int i=0; i<100000; ++i) { sum += 1; } } } //模板方法设计模式 public class TemplateMethodDemo { public static void main(String[] args) { System.out.println(new StringOperator().totalTime()); System.out.println(new IntOperator().totalTime()); } }