模板方法模式學習和思考

2021-08-09 23:01:27 字數 1416 閱讀 3276

1.概念

模板方法模式(template method):

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

2.理解:

1.例如,某行為是由一系列子行為按照一定的順序組成,當乙個父類的若干個子類都要執行此行為,但這些子類的此行為在某些子行為上有差別,於是就又用到萬能的多型了。不同的子類重寫某些子類即可。原理簡單。

2.此模式能實現子類反向控制父類的行為,打破了慣例,而且也符合oo原則。

3.實現

在實現模板方法模式時,開發抽象類的軟體設計師和開發具體子類的軟體設計師之間可以進行協作。乙個設計師負責給出乙個演算法的輪廓和框架,另一些設計師則負責給出這個演算法的各個邏輯步驟。實現這些具體邏輯步驟的方法即為基本方法,而將這些基本方法彙總起來的方法即為模板方法,模板方法模式的名字也因此而來。下面將詳細介紹模板方法和基本方法:

1. 模板方法

乙個模板方法是定義在抽象類中的、把基本操作方法組合在一起形成乙個總算法或乙個總行為的方法。這個模板方法定義在抽象類中,並由子類不加以修改地完全繼承下來。模板方法是乙個具體方法,它給出了乙個頂層邏輯框架,而邏輯的組成步驟在抽象類中可以是具體方法,也可以是抽象方法。由於模板方法是具體方法,因此模板方法模式中的抽象層只能是抽象類,而不是介面。

2. 基本方法

基本方法是實現演算法各個步驟的方法,是模板方法的組成部分。基本方法又可以分為三種:抽象方法(abstract method)、具體方法(concrete method)和鉤子方法(hook method)

。(1) 

抽象方法

:乙個抽象方法由抽象類宣告、由其具體子類實現。在c#語言裡乙個抽象方法以abstract關鍵字標識。

(2) 

具體方法

:乙個具體方法由乙個抽象類或具體類宣告並實現,其子類可以進行覆蓋也可以直接繼承來使用。

(3) 

鉤子方法

:乙個鉤子方法由乙個抽象類或具體類宣告並實現,而其子類可能會加以擴充套件。通常在父類中給出的實現是乙個空實現(可使用virtual關鍵字將其定義為虛函式),並以該空實現作為方法的預設實現,當然鉤子方法也可以提供乙個非空的預設實現。

在模板方法模式中,鉤子方法有兩類:第一類鉤子方法可以與一些具體步驟「掛鉤」

,以實現在不同條件下執行模板方法中的不同步驟,這類鉤子方法的返回型別通常是bool型別的,這類方法名一般為is***(),用於對某個條件進行判斷,如果條件滿足則執行某一步驟,否則將不執行。

還有一類鉤子方法就是

實現體為空的具體方法

,子類可以根據需要覆蓋或者繼承這些鉤子方法,與抽象方法相比,這類鉤子方法的好處在於子類如果沒有覆蓋父類中定義的鉤子方法,編譯可以正常通過,但是如果沒有覆蓋父類中宣告的抽象方法,編譯將報錯。

設計模式學習 模板方法模式

型別 行為模式 模板方法模式定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些 特定步驟。uml圖 新建賽車的父類 package car package public class car parent public void setsp...

設計模式學習 模板方法模式

1.雜言 設計模式,現在覺得每種模式像工業行業的一些典型零件。這些零件也可以變種出很多類似零件。吧這些零件組合起來,就成了一台機器。好吧,我現在是這麼理解的。一般 結構都是,一層呼叫一層,就是一般都是頂層的呼叫底層的。但模板方法確實反過來的,有父類呼叫子類的方法。這個聽說又牽扯到啥好萊塢原則。對於這...

設計模式學習 模板方法模式

模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟.父類就應該要成為子類的模板,所有重複的 都應該要上公升到父類中,而不是讓每個子類都取重複,重要,複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細...