定義
定義一個操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
模板方法的通用類圖如下圖所示:
模板方法非常簡單,僅僅使用了Java的繼承機制,但它是一個應用非常廣泛的模式,其中AbstractClass叫做抽象模板,它的方法分爲兩類:
- 基本方法:由子類實現,並且在模板方法中被調用。
- 模板方法:可以有一個或幾個,一般是一個具體的方法,也就是一個框架,實現對基本方法的調用,完成固定的邏輯。
通用代碼實現
抽象模板類
public abstract class AbstractClass {
//基本方法
protected abstract void doSmothing();
//基本方法
protected abstract void doAnything();
//模板方法
public void templateMethod(){
//調用基本方法,完成相關的邏輯
this.doAnything();
this.doSomething();
}
}
具體模板類
public class ConcreteClass1 extends AbstractClass {
//實現基本方法
protected void doAnything(){
//業務處理邏輯
}
//實現基本方法
protected void doSomething(){
//業務處理邏輯
}
}
public class ConcreteClass2 extends AbstractClass {
//實現基本方法
protected void doAnything(){
//業務處理邏輯
}
//實現基本方法
protected void doSomething(){
//業務處理邏輯
}
}
抽象模板中的基本方法儘量設計爲protected類型,符合迪米特法則,不需要暴露的屬性或方法儘量不要設置爲public類型。實現類若非必要,儘量不要擴大父類中的訪問權限。
優點
- 封裝不變部分,擴展可變部分。把認爲是不變部分的算法封裝到父類實現,而可變部分的則可以通過繼承來繼續擴展。
- 提取公共部分代碼,便於維護。
- 行爲由父類控制,子類實現。子類可以通過擴展的方式增加相應的功能,符合開閉原則。
缺點
抽象類負責聲明最抽象,最一般的事物屬性和方法,實現類完成具體的事物屬性和方。但是模板方法模式卻顛倒了,抽象類定義部分抽象方法,由子類實現,子類執行的結果影響父類的結果,也就是子類對父類產生了影響。
使用場景
- 多個子類有共有的方法,並且邏輯基本相同時。
- 重要、複雜的算法,可以把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現。