標(biāo)簽: 設(shè)計(jì)模式初涉
描述性文字
終于來到23種設(shè)計(jì)模式的最后一種:模板方法模式,聽名字感覺好像很復(fù)雜的樣子奠衔,
實(shí)則不然谆刨,先不講概念,先寫個(gè)簡單的例子归斤,通過例子來感受這個(gè)模式痊夭。
代碼示例
既然是最后一節(jié)的了,還是要走一波回憶殺的脏里,還記得之前小豬奶茶店的例子嗎她我?
在工廠方法模式那一章,我們寫了奶茶的制作過程過程是如下四步
![](http://static.zybuluo.com/coder-pig/jcrbbvamy8sexco79ute2ej2/image_1bbnidotii3k1r70okri1j4ob9.png)
奶茶的制作過程都是以上四步,我們用模板方法模式來寫個(gè)例子
先定義一個(gè)抽象的模板方法類番舆,這里我還加了一個(gè)鉤子方法
鉤子是一種被聲明在抽象類的方法根吁,可以為空或者默認(rèn)的實(shí)現(xiàn)。鉤子
的存在可以讓子類有能力對(duì)算法的不同點(diǎn)進(jìn)行掛鉤合蔽,是否需要掛鉤由
子類決定击敌。比如這里通過一個(gè)標(biāo)記確定是否需要打包,子類中可以
定義一個(gè)方法來調(diào)用這個(gè)方法拴事,我們在椰果綠茶里重寫這個(gè)鉤子方法沃斤。
![](http://static.zybuluo.com/coder-pig/a4ulffaohbk6ep5mfvpht62e/2.png)
接著是具體實(shí)現(xiàn)類,珍珠紅茶 與 椰果綠茶
![](http://static.zybuluo.com/coder-pig/3ci4mmz09mvns7v1jqireevg/3.png)
![](http://static.zybuluo.com/coder-pig/q7aptd4xdfiuvexixfz2vrmc/4.png)
最后客戶端調(diào)用
![](http://static.zybuluo.com/coder-pig/373ppf1b25b7kvlrcbtsd0s9/6.png)
輸出結(jié)果
![](http://static.zybuluo.com/coder-pig/d0wztj8j01ugf7da4fs1d3f8/7.png)
好的刃宵,例子非常簡單衡瓶,概念這些東西也就不難理解了~
概念相關(guān)
定義
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中牲证,使得子類可以不改變
一個(gè)算法的結(jié)構(gòu)即可沖定義該算法的某些特定步驟哮针。
兩個(gè)角色
- AbstractClass:抽象模板,定義了模板結(jié)構(gòu)坦袍,讓子類去具體實(shí)現(xiàn)
- ConcreteClass:具體模板十厢,具體實(shí)現(xiàn)抽象類的抽象方法
UML類圖
![](http://static.zybuluo.com/coder-pig/x1xqjkos0xqfcai00eiezf2w/8.png)
使用場景
- 對(duì)一些復(fù)雜的算法進(jìn)行分割,將其算法中固定不變的部分設(shè)計(jì)為模板方法和父類具體方法捂齐,
而一些可以改變的細(xì)節(jié)由其子類來實(shí)現(xiàn)蛮放。 - 各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù)。
- 需要通過子類來決定父類算法中某個(gè)步驟是否執(zhí)行奠宜,實(shí)現(xiàn)子類對(duì)父類的反向控制包颁。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 1.代碼復(fù)用,相同部分代碼放在抽象的父類中
- 2.良好的可擴(kuò)展性
- 3.反向控制压真,通過父類調(diào)用子類的操作娩嚼,通過子類的擴(kuò)展添加新的行為
缺點(diǎn)
需要為每一個(gè)基本方法的不同實(shí)現(xiàn)提供一個(gè)子類,如果父類中可變的基本方法太多滴肿,
將會(huì)導(dǎo)致類的個(gè)數(shù)增加岳悟,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象嘴高。
本節(jié)代碼示例
https://github.com/coder-pig/DesignPatternsExample/tree/master/23.Template%20Method%20Pattern