📢 本文由 gemini-2.5-flash 翻譯
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");
}
}
|