HeadFirst 設計模式 - Chapter8 模板方法設計模式

定義

在一個方法中定義了一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠在不改變算法結構的狀況下,從新定義算法中的某些步驟。java

是一種重要的代碼複用的重要技巧。從實現的角度來講,這符合封裝變化的思想。同時,鉤子是被聲明在抽象類中,可是只有空的或者默認的算法實現,由子類決定是否進行覆蓋,對算法的不一樣點進行掛鉤。當兩個或多個類執行的操做能夠抽象爲統一的步驟算法,只是在每步細節的實現上有差別,則能夠依賴模板方法構造一種繼承體系(有變化就封裝繼承體系)算法

模板 = 方法 = 一組步驟(任何步驟均可以是抽象的,由子類負責實現)這能夠確保算法的結構保持不變,同時由子類提供實現。spa

類圖以下:
clipboard.png]code

hook是對那些子類能夠選擇實現的功能,在抽像類中給出一個簡單的默認實現,讓子類決定去不去覆蓋
這裏涉及到兩個角色:
抽象模板繼承

  • 定義了一個或多個抽象操做,以便讓子類實現。這些抽象操做叫作基本操做,它們是一個頂級邏輯的組成步驟。
  • 定義並實現了一個模板方法。這個模板方法通常是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操做中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。

具體模板ip

  • 實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。
  • 每個抽象模板角色均可以有任意多個具體模板角色與之對應,而每個具體模板角色均可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不一樣實現,從而使得頂級邏輯的實現各不相同。
javaabstract class AbstractClass{
    final void templateMethod(){
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook();
    } // 聲明爲final 以避免子類改變這個算法的順序
    abstract void primitiveOperation1(); // 子類實現
    abstract void primitiveOperation2(); // 子類實現
    void concreteOperation(){
    }
    void hook(){}
}

什麼時候使用抽象方法?什麼時候使用hook?
當你的子類必須提供算法中某個步驟的實現時,就用抽象方法;
若是算法中這個步驟是可選的,就用hook. 經過使用鉤子,讓抽象類的子類的負荷減輕ituit

相關文章
相關標籤/搜索