標簽: 設計模式初涉
描述性文字
終于來到23種設計模式的最后一種:模板方法模式,聽名字感覺好像很復雜的樣子,
實則不然,先不講概念,先寫個簡單的例子,通過例子來感受這個模式。
代碼示例
既然是最后一節的了,還是要走一波回憶殺的,還記得之前小豬奶茶店的例子嗎?
在工廠方法模式那一章,我們寫了奶茶的制作過程過程是如下四步

奶茶的制作過程都是以上四步,我們用模板方法模式來寫個例子
先定義一個抽象的模板方法類,這里我還加了一個鉤子方法
鉤子是一種被聲明在抽象類的方法,可以為空或者默認的實現。鉤子
的存在可以讓子類有能力對算法的不同點進行掛鉤,是否需要掛鉤由
子類決定。比如這里通過一個標記確定是否需要打包,子類中可以
定義一個方法來調用這個方法,我們在椰果綠茶里重寫這個鉤子方法。

接著是具體實現類,珍珠紅茶 與 椰果綠茶


最后客戶端調用

輸出結果

好的,例子非常簡單,概念這些東西也就不難理解了~
概念相關
定義
定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變
一個算法的結構即可沖定義該算法的某些特定步驟。
兩個角色
- AbstractClass:抽象模板,定義了模板結構,讓子類去具體實現
- ConcreteClass:具體模板,具體實現抽象類的抽象方法
UML類圖

使用場景
- 對一些復雜的算法進行分割,將其算法中固定不變的部分設計為模板方法和父類具體方法,
而一些可以改變的細節由其子類來實現。 - 各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。
- 需要通過子類來決定父類算法中某個步驟是否執行,實現子類對父類的反向控制。
優缺點
優點
- 1.代碼復用,相同部分代碼放在抽象的父類中
- 2.良好的可擴展性
- 3.反向控制,通過父類調用子類的操作,通過子類的擴展添加新的行為
缺點
需要為每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,
將會導致類的個數增加,系統更加龐大,設計也更加抽象。
本節代碼示例
https://github.com/coder-pig/DesignPatternsExample/tree/master/23.Template%20Method%20Pattern