1. 程式人生 > >設計模式之 Template Method - 模板方法模式

設計模式之 Template Method - 模板方法模式

本文介紹設計模式中的模板方法(Template Method)模式的概念,用法,以及實際應用中怎麼樣使用Template Method模式進行開發。

Template Method模式的概念 Template Method模式正如其名,在作為抽象類的父類裡,定義了一個具有固定演算法並可以細分為多個步驟的模板方法(public),Template Method模式把這些可以被細分的可變步驟抽象為可以被子類過載的抽象方法(protected abstract),並通過在子類中的過載(重新定義),做到無需改變模板方法的演算法步驟而可以重新定義該演算法中的某些特定的步驟。
如圖[該圖出自維基百科wikipedia.org]:



我們結合上面的定義解釋一下該圖。
- AbstractClass便相當於上述作為抽象類的父類,ConcreteClass便是具體的實現子類。具體的應用中,可能存在一到多個實現子類。
- AbstractClass定義了一個public的templateMethod()模板方法以及作為步驟的method1()與method2()方法。
- AbstractClass#templateMethod()方法體呼叫method1()與method2()方法
    public void templateMethod() {
        ...
        this.method()1;
        ...
        this.method()2;
        ...
    }
- method1()與method2()方法為受保護的抽象方法(protected abstract)。實現子類ConcreteClass需要過載該方法。

Template Method模式的應用場景 Template Method模式一般應用在具有以下條件的應用中:
- 具有統一的操作步驟或操作過程
- 具有不同的操作細節
- 存在多個具有同樣操作步驟的應用場景,但某些具體的操作細節卻各不相同

Template Method模式的應用範例 下面我們舉個例子來加深我們對Template Method模式的理解。
比如有一個汽車加工廠,要組裝一輛汽車;它的基本組裝步驟是:
- 組裝車頭
- 組裝車身
- 組裝車尾
- 測試組裝的車體

不管被組裝的是吉普車,卡車,還是公交車,它們的基本組裝步驟都是一樣的,雖然在組裝的步驟中,會有細微的差別。

通過上面的分析,我們知道,該範例滿足Template Method模式的應用場景所提到的條件:
- 具有統一的操作步驟或操作過程:組裝的步驟一樣
- 具有不同的操作細節:各步驟有細微的區別。例如,組裝吉普車的車頭需要吉普車的車頭零件
- 存在多個具有同樣操作步驟的應用場景,但某些具體的操作細節卻各不相同。可能需要組裝不同的汽車,如吉普車,卡車,公交車等等


下面我們用Template Method設計模式來抽象以上組裝過程。
- MakeCar:汽車組裝類
- MakeJeep:吉普車組裝類

原始碼
//汽車組裝抽象類
public abstract class MakeCar {
    //組裝車頭
    abstract void makeHead();
    //組裝車身
    abstract void makeBody();
    //組裝車尾
    abstract void makeTail();
    //測試
    abstract boolean checkMake();

    public void make() {
        System.out.println("Start make car...");
        makeHead();
        makeBody();
        makeTail();
        if
(checkMake()) {
            System.out.println("Make OK.");
        } else {
            System.out.println("Make Failure.");
        }
  }
}

//吉普車組裝類
public class MakeJeep extends MakeCar {
    //組裝車頭
    void makeHead() {
        System.out.println("Make Jeep head.");
    }
    //組裝車身
    void makeBody() {
        System.out.println("Make Jeep body.
");
    }
    //組裝車尾
    void makeTail() {
        System.out.println("Make Jeep tail.");
    }
    //測試
    boolean checkMake() {
        return true;
    }
}

//呼叫
public class Client {
    public static void main(String[] args) {
        MakeJeep makeJeep = new MakeJeep();

        makeJeep.make();
    }
}


執行並顯示Client:
C:\TemplateMethod>javac *.java
C:\TemplateMethod>java Client
Start make car...
Make Jeep head.
Make Jeep body.
Make Jeep tail.
Make OK.
C:\TemplateMethod>


Template Method模式與Factory Method模式的區別 我們在
設計模式之Factory Method - 工廠模式
一文中對Factory Method模式作了介紹,細心的讀者可能會發現,這2種模式存在相似的地方:
都是在抽象父類中定義抽象方法,通過子類繼承在子類中過載父類的抽象方法來實現。
但他們之間存在本質的區別:
Template Method只是繼承的關係,Factory Method除了繼承之外,還有有建立的過程。
我們注意到,在Factory Method模式中,被定義的抽象方法建立了產品物件,也就是說,在Factory Method模式中,除了具有繼承關係的抽象父類工廠與具體的子類工廠之外,還有具有繼承關係的產品類,並且工廠類與產品類之間存在建立與被建立的關係;而Template Method模式則不存在此關係。


Template Method模式小結 Template Method模式是一種非常基礎非常常見的面向物件的設計模式之一,在實際的應用中,它用得非常廣泛。