樣板方法模式

📢 本文由 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");
    }
}