首頁 > 軟體

Java設計模式之模板方法模式詳解

2022-03-24 19:00:19

模板方法模式

模板方法模式法(Template Method)定義一個操作中的演演算法骨架,而將演演算法的一些步驟延遲到子類中,使得子類可以不改變該演演算法結構的情況下重定義該演演算法的某些特定步驟。

模板方法模式包含以下主要角色:

  • 抽象類(Abstract Class):負責給出一個演演算法的輪廓和骨架。它由一個模板方法和若干個基本方法構成。
    • 模板方法:定義了演演算法的骨架,按某種順序呼叫其包含的基本方法。
    • 基本方法:是實現演演算法各個步驟的方法。基本方法又可以分為三種:
      • 抽象方法(Abstract Method) :一個抽象方法由抽象類宣告、由其具 體子類實現。
      • 具體方法(Concrete Method) :一個具體方法由一個抽象類或具體類宣告並實現,其子類可以進行覆蓋也可以直接繼承。
      • 勾點方法(Hook Method) :在抽象類中已經實現,包括用於判斷的邏輯方法和需要子類重寫的空方法兩種。一般勾點方法是用於判斷的邏輯方法,這類方法名一般為isXxx,返回值型別為boolean型別。
  • 具體子類(Concrete Class):實現抽象類中所定義的抽象方法和勾點方法,它們是一個頂級邏輯的組成步驟。

【案例】

炒菜的步驟是固定的,分為倒油、熱油、倒蔬菜、倒調料品、翻炒等步驟。但是可以倒入不同的蔬菜和不同的醬料。現通過模板方法模式來用程式碼模擬

public class TemplateTest {
    public static void main(String[] args) {
        //炒包菜
        BaoCai baoCai = new BaoCai();
        baoCai.cookProcess();
        System.out.println("-------------");
        //炒白菜
        BaiCai baiCai = new BaiCai();
        baiCai.cookProcess();
    }
}
abstract class AbstractClass{ //抽象類
    //模板方法定義
    public final void cookProcess() {
        this.pourOil();//倒油
        this.heatOil();//熱油
        this.pourVegetable();//倒蔬菜
        this.pourSauce();//倒調味料
        this.fry();//翻炒
    }
    public abstract void pourVegetable();//倒蔬菜是不一樣的(一個下包菜,一個是下白菜)
    public abstract void pourSauce();//倒調味料是不一樣
    public void pourOil() {System.out.println("倒油");}
    public void heatOil() {System.out.println("熱油");}
    public void fry(){System.out.println("炒啊炒");}
}
class BaoCai extends AbstractClass{
    public void pourVegetable() {System.out.println("加入包菜");}
    public void pourSauce() {System.out.println("加入辣椒醬");}
}
class BaiCai extends AbstractClass{
    public void pourVegetable() {System.out.println("加入白菜");}
    public void pourSauce() {System.out.println("加入鹽和味精");}
}

【執行結果】

倒油
熱油
加入包菜
加入辣椒醬
炒啊炒
-------------
倒油
熱油
加入白菜
加入鹽和味精
炒啊炒

Process finished with exit code 0

模板方法模式的優缺點

優點:

1、提高程式碼複用性,將相同部分的程式碼放在抽象的父類別中,而將不同的程式碼放入不同的子類中。

2、實現了反向控制,通過一個父類別呼叫其子類的操作,通過對子類的具體實現擴充套件不同的行為,實現了反向控制 ,並符合“開閉原則”。

缺點:

1、對每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。

2、父類別中的抽象方法由子類實現,子類執行的結果會影響父類別的結果,這導致一種反向的控制結構,它提高了程式碼閱讀的難度。

使用場景

1、演演算法的整體步驟很固定,但其中個別部分易變時,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現。

2、需要通過子類來決定父類別演演算法中某個步驟是否執行,實現子類對父類別的反向控制。

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!  


IT145.com E-mail:sddin#qq.com