設計模式之模板方法模式

2021-09-25 08:33:27 字數 3200 閱讀 3343

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

1、概念

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

2、例子

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

第一步:放油

第二步:放西紅柿

第三步:放雞蛋

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

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

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

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

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

下面**實現一下。

3、**實現

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

public

abstract

class

cook

}

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

首先是我做飯

public

class

mecook

extends

cook

@override

public

void

egg(

)@override

public

void

tomato()

}

然後是大廚做飯

public

class

chefcook

extends

cook

@override

public

void

egg(

)@override

public

void

tomato()

}

第三步:模擬炒菜的過程

public

class

test

}//output:

//自己:放十斤油

//自己:放乙個雞蛋

//自己:放10個雞蛋

//大廚:放適量油

//大廚:放適量雞蛋

//大廚:放適量西虹市

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

4、優缺點

先說一下他的優點吧:

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

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

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

再聊一下他的缺點:

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

5、鉤子函式

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

第一步:定義模板類:

public

abstract

class

cook

//把做飯的方法封裝起來

final

public

void

cook()

}}

第二步:定義具體類

首先是自己:

public

class

mecook

extends

cook

//子類傳遞過來的命令決定

@override

public

boolean

isaddoil()

@override

public

void

oil(

)@override

public

void

egg(

)@override

public

void

tomato()

}

然後是大廚

public

class

chefcook

extends

cook

//子類傳遞過來的命令決定

@override

public

boolean

isaddoil()

@override

public

void

oil(

)@override

public

void

egg(

)@override

public

void

tomato()

}

第三步:測試一下:

public

class

test

}//output

//自己:放乙個雞蛋

//自己:放10個雞蛋

//大廚:放適量雞蛋

//大廚:放適量西虹市

//大廚:放適量油

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

ook();}}

//output

//自己:放乙個雞蛋

//自己:放10個雞蛋

//大廚:放適量雞蛋

//大廚:放適量西虹市

//大廚:放適量油

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

模板設計模式 PHP設計模式之模板方法模式

模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...

設計模式之模板方法設計模式

父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...

設計模式之模板方法模式

定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟 型別 行為類模式 事實上,模板方法是程式設計中乙個經常用到的模式。比如,給定乙個整數陣列,把陣列中的數由大到小順序,然後把排序之後的結果列印出來。這個需求大體可以分為兩部分,...