1.定義

定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

2.通用類圖

  • AbstractClass 抽象模板
    抽象模板的方法分為兩類:基本方法,模板方法
    • 基本方法:也叫基本操作,由子類實現的方法,並且在模板方法被呼叫
    • 模板方法:可以有一個或幾個,也就是一個框架,實現對基本方法的排程,完成固定的邏輯
      • 注意:為了防止惡意操作,一般模板方法都加上final關鍵字,不允許子類覆寫
  • ConcreteClass 具體模板
    實現父類所定義的一個或多個抽象方法,也就是父類定義的基本方法在子類中的實現

3.通用原始碼

抽象模板類

public abstract class AbstractClass {
   //基本方法
    protected abstract void doSomething();
    //基本方法
    protected abstract void doAnything();
    //模板方法
    public void templateMethod() {
        /**
         * 呼叫基本方法,完成相關的邏輯
         */
        this.doAnything();
        this.doSomething();
    }
}

具體模板類

public class ConcreteClass1 extends AbstractClass {
    //實現基本方法
    protected void doSomething() {
       //業務邏輯處理
    }
    protected void doAnything() {
     //業務邏輯處理
    }
}
public class ConcreteClass2 extends AbstractClass {
    //實現基本方法
    protected void doSomething() {
       //業務邏輯處理
    }
    protected void doAnything() {
     //業務邏輯處理
    }
}

場景類

public class Client {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
        //呼叫模板方法
        class1.templateMethod();
        class2.templateMethod();
    }
}

注意:抽象模板中的基本方法儘量設計為protected型別,符合迪米特法則,不需要暴露的屬性或方法儘量不要設定為protected型別。實現類若非必要,儘量不要擴大父類中的訪問許可權。

4.Demo

5.優缺點

優點

  • 封裝不變部分,擴充套件可變部分。
    • 把認為不變的部分的演算法封裝到父類實現,而可變部分可以通過繼承來繼續擴充套件
  • 提取公共部分程式碼,便於維護。
  • 行為由父類控制,子類實現。
    • 基本方法由子類實現,子類可以通過擴充套件的方法增加響應的功能,符合開閉原則

缺點

  • 每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。

6.應用場景

  • 多個子類有共有的方法,並且邏輯基本相同時
  • 重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能則由各個子類實現。
  • 重構時,模板方法模式是一個經常使用的模式,把相同的程式碼抽取到父類中,然後通過鉤子函式約束其行為。
    (未完待續)