模板方法模式法(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、需要透過子類別來決定父類別演算法中某個步驟是否執行,實作子類別對父類別的反向控制。
以上是Java設計模式:模板方法模式實例解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!