Template Method Pattern 类行为型模式
意图
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
结构
其中:
- AbstractClass (抽象类) 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在 AbstractClass 或其他对象中的操作
- ConcreteClass (具体类) 实现原语操作以完成算法中与特定子类相关的步骤
适用性
Template Method 模式适用于:
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复
- 控制子类扩展。模板方法旨在特定点调用 “hook” 操作 (默认的行为,子类可以在必要时进行重定义扩展) ,这就只允许在这些点进行扩展
例子
去课堂,学生是上课,写作业;老师授课,批改作业
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class TemplateMethodPattern {
public static void main(String[] args) {
Person stu = new Student();
Person tec = new Teacher();
stu.TemplateMethod();
System.out.println("==========");
tec.TemplateMethod();
}
}
abstract class Person{
public void TemplateMethod(){
System.out.println("go to class");
PrimitiveOperation1();
System.out.println("End of class");
PrimitiveOperation2();
}
public abstract void PrimitiveOperation1(); // 原语操作1:上课:学生:听课;老师:讲课
public abstract void PrimitiveOperation2(); // 原语操作2:作业:学生:做作业;老师:改作业
}
class Student extends Person{
@Override
public void PrimitiveOperation1(){
System.out.println("Listen");
}
public void PrimitiveOperation2(){
System.out.println("Do assignments");
}
}
class Teacher extends Person{
@Override
public void PrimitiveOperation1(){
System.out.println("Teach");
}
public void PrimitiveOperation2(){
System.out.println("Grade assignments");
}
}