說明
模板方法(Template Method)模式是一種行爲型模式,它定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
應用場景
- 多個子類有共有的方法,並且邏輯基本相同。
- 重要、複雜的算法,可以把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現。
- 重構時,模板方法是一個經常使用的方法,把相同的代碼抽取到父類中,然後通過構造函數約束其行爲。
模式特徵
AbstractClass(抽象類角色):實現一個模板方法,定義了算法的骨架,具體子類將重定義PrimitiveOperation以實現一個算法的步驟。AbstractClass其實就是一個抽象模板,定義並實現了一個模板方法。這個模板方法一般是一個具體的方法。它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。
ConcreteClasses(具體類角色):實現PrimitiveOperation以完成算法與特定子類相關的步驟。ConcreteClass實現父類所定義的一個或多個抽象方法。每一個AbstractClass都可以有任意多個ConcreteClass與之對應,而每一個ConcreteClass都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。
代碼實現
- 抽象類角色
public abstract class Travel {
public abstract void mode();
public void travelToBeijing(){
mode();
}
}
- 具體類角色一
public class TravelByTrain extends Travel {
@Override
public void mode() {
System.out.println("坐火車去北京旅遊");
}
}
- 具體類角色二
public class TravelByPlane extends Travel{
@Override
public void mode() {
System.out.println("坐飛機去北京旅遊");
}
}
- 客戶端測試
public class Client {
public static void main(String[] args) {
Travel travel1 = new TravelByTrain();
travel1.travelToBeijing();
Travel travel2 = new TravelByPlane();
travel2.travelToBeijing();
}
}
- 結果
坐火車去北京旅遊
坐飛機去北京旅遊
優缺點
優點
- 模板方法模式通過把不變的行爲搬移到父類,去除了子類中的重複代碼。
- 子類實現算法的某些細節,有助於算法的擴展。
- 通過一個父類調用子類實現的操作,通過子類擴展增加新的行爲,符合“開放-封閉原則”。
缺點
按照設計習慣,抽象類負責聲明最抽象、最一般的事物屬性和方法,實現類負責完成具體的事務屬性和方法,但是模板方式正好相反,子類執行的結果影響了父類的結果,會增加代碼閱讀的難度。