設計模式-- 模板方法模式

模板方法模式也是也是比較容易理解的,就比如說做飯,同樣的步驟不同的人做味道是不一樣的。或者是造汽車,同樣的步驟,造車廠商不一樣,造出來的汽車質量不同。這就是模板方法模式。這篇文章將通過案例詳細的講解一下模板方法模式。

1、概念

它定義一個操作中的算法的框架,而將一些步驟延遲到了子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些步驟。

2、例子

我們拿做飯的例子來說明。比如就做個西紅柿雞蛋吧。我們可以簡單地定義一下步驟:

第一步:放油

第二步:放西紅柿

第三步:放雞蛋

當然真正做起來可能要比這複雜的多,就不必糾結於此了。上面我們提到過,同樣的步驟其實不同的人做出來的飯是不一樣的。我們就拿自己和五星級大廚來比較吧。人總是要有點自信心,雖然會被打臉。

不過在代碼實現之前,我們可以先看一下模板方法模式的類圖:

 

我們就拿自己和大廚比較,我們可以看到在這裏其實有兩個角色:

(1)模板方法:他定義了一系列方法,提供了一個骨架。

(2)具體類:實現上面模板方法類提供的骨架。不同的具體類實現這個模板方法的骨架方式是不一樣的。

下面代碼實現一下。

3、代碼實現

第一步:定義模板方法類(cook的骨架)

 

第二步:定義具體類(我和大廚)

首先是我做飯

 

然後是大廚做飯

 

第三步:模擬炒菜的過程

 

看結果我們就能知道,炒西紅柿雞蛋的過程是一樣的,但是實現起來卻不一樣,就像買衣服,模特身上穿起來很好看,但是自己買的時候穿起來那真是慘不忍睹,這就是模板方法模式,我們對其進行一個總結。

4、優缺點

先說一下他的優點吧:

(1)把不可改變的封裝起來,把能夠改變的擴展開來

(2)他把很多類的共同操作給封裝了起來,利於維護

(3)其實我們發現,我們在定義行爲時候都是由父類去定義,然後子類去實現即可。

再聊一下他的缺點:

缺點很簡單,我們發現雖然我們把一些類的共同操作封裝了起來,但是當這些類比較多時,效果就不好了,因爲有一個拓展子類都需要繼承它,子類多了就不好了。

 

5、鉤子函數

鉤子就是給子類一個授權,讓子類來決定模板方法的邏輯執行。就比如在炒西紅柿雞蛋的時候,由子類去決定是否要加調料。我們去實現一下:

第一步:定義模板類:

 

第二步:定義具體類

首先是自己:

 

然後是大廚

 

第三步:測試一下:

 

鉤子函數就是這樣使用的。子類就可以設置其邏輯是否執行。自己動手寫一遍是理解最好的方式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章