1. 程式人生 > >設計模式總結之TemplateMethod Pattern(模版方法模式)

設計模式總結之TemplateMethod Pattern(模版方法模式)

目錄

建立型設計模式: 結構型設計模式: 行為型設計模式:

TemplateMethod Pattern(模版方法模式)

意圖

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

適用性

* 一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現。
* 各子類中公共的 行為應被提取出來並集中到一個公共父類中以避免程式碼重複。這是Opdyke和Johnson所描述過的“重分解以一般化”的一個很好的例子。首先識別現有 程式碼中的不同之處,並且將不同之處分離為新的操作。最後,用一個呼叫這些新的操作的模板方法來替換這些不同的程式碼。
* 控制子類擴充套件。模板方法只在特定點呼叫“hook”操作,這樣就只允許在這些點進行擴充套件。

結構



參與者:
* AbstractClass(抽象類,如Application)
— 定義抽象的原語操作(primitive operation),具體的子類將重定義它們以實現一個演算法的各步驟。 
— 實現一個模板方法 ,定義一個演算法的骨架。該模板方法不僅呼叫原語操作,也呼叫定義 在AbstractClass或其他物件中的操作。 

* ConcreteClass(具體類,如MyApplication)
— 實現原語操作以完成演算法中與特定子類相關的步驟。


例子




優缺點

> 優點:
1. 封裝不變部分,擴充套件可變部分
   把認為是不變部分的演算法封裝到父類實現,而可變部分的則可以通過繼承來繼續擴充套件。在悍馬模型例子中,是不是就非常容易擴充套件?例如增加一個H3型號的悍馬模型,很容易呀,增加一個子類,實現父類的基本方法就可以了。   

2. 提取公共部分程式碼,便於維護
   我們例子中剛剛走過的彎路就是最好的證明,如果我們不抽取到父類中,任由這種散亂的程式碼發生,想想後果是什麼樣子?維護人員為了修正一個缺陷,需要到處查詢類似的程式碼!

3. 行為由父類控制,子類實現
   基本方法是由子類實現的,因此子類可以通過擴充套件的方式增加相應的功能,符合開閉原則。
   
> 缺點:
按照我們的設計習慣,抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類完成具體的事物屬性和方法。但是模板方法模式卻顛倒了,抽象類定義了部分抽象方法,由子類實現,子類執行的結果影響了父類的結果,也就是子類對父類產生了影響,這在複雜的專案中,會帶來程式碼閱讀的難度,而且也會讓新手產生不適感。