模板方法模式也是也是比較容易理解的,就比如說做飯,同樣的步驟不同的人做味道是不一樣的。或者是造汽車,同樣的步驟,造車廠商不一樣,造出來的汽車質量不同。這就是模板方法模式。這篇文章將通過案例詳細的講解一下模板方法模式。
1、概念
它定義一個操作中的算法的框架,而將一些步驟延遲到了子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些步驟。
2、例子
我們拿做飯的例子來說明。比如就做個西紅柿雞蛋吧。我們可以簡單地定義一下步驟:
第一步:放油
第二步:放西紅柿
第三步:放雞蛋
當然真正做起來可能要比這複雜的多,就不必糾結於此了。上面我們提到過,同樣的步驟其實不同的人做出來的飯是不一樣的。我們就拿自己和五星級大廚來比較吧。人總是要有點自信心,雖然會被打臉。
不過在代碼實現之前,我們可以先看一下模板方法模式的類圖:
我們就拿自己和大廚比較,我們可以看到在這裏其實有兩個角色:
(1)模板方法:他定義了一系列方法,提供了一個骨架。
(2)具體類:實現上面模板方法類提供的骨架。不同的具體類實現這個模板方法的骨架方式是不一樣的。
下面代碼實現一下。
3、代碼實現
第一步:定義模板方法類(cook的骨架)
第二步:定義具體類(我和大廚)
首先是我做飯
然後是大廚做飯
第三步:模擬炒菜的過程
看結果我們就能知道,炒西紅柿雞蛋的過程是一樣的,但是實現起來卻不一樣,就像買衣服,模特身上穿起來很好看,但是自己買的時候穿起來那真是慘不忍睹,這就是模板方法模式,我們對其進行一個總結。
4、優缺點
先說一下他的優點吧:
(1)把不可改變的封裝起來,把能夠改變的擴展開來
(2)他把很多類的共同操作給封裝了起來,利於維護
(3)其實我們發現,我們在定義行爲時候都是由父類去定義,然後子類去實現即可。
再聊一下他的缺點:
缺點很簡單,我們發現雖然我們把一些類的共同操作封裝了起來,但是當這些類比較多時,效果就不好了,因爲有一個拓展子類都需要繼承它,子類多了就不好了。
5、鉤子函數
鉤子就是給子類一個授權,讓子類來決定模板方法的邏輯執行。就比如在炒西紅柿雞蛋的時候,由子類去決定是否要加調料。我們去實現一下:
第一步:定義模板類:
第二步:定義具體類
首先是自己:
然後是大廚
第三步:測試一下:
鉤子函數就是這樣使用的。子類就可以設置其邏輯是否執行。自己動手寫一遍是理解最好的方式。