模板方法模式

2021-10-03 23:15:40 字數 2914 閱讀 6028

定義

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

模板方法模式屬於類行為型模式。

要點優點:

封裝了不變部分,擴充套件可變部分。它把認為是不變部分的演算法封裝到父類中實現,而把可變部分演算法由子類繼承實現,便於子類繼續擴充套件。

在父類中提取了公共的部分**,便於**復用。

部分方法是由子類實現的,因此子類可以通過擴充套件方式增加相應的功能,符合開閉原則。

缺點:對每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。

父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了**閱讀的難度。

模板方法模式包含以下主要角色:

抽象類(abstract class):負責給出乙個演算法的輪廓和骨架。它由乙個模板方法和若干個基本方法構成。這些方法的定義如下:

① 模板方法:定義了演算法的骨架,按某種順序呼叫其包含的基本方法。

② 基本方法:是整個演算法中的乙個步驟,包含以下幾種型別:

鉤子方法常出現在模板方法模式中,鉤子可以在定義時就掛著東西(父類可有實現),可以在後來看情況掛上別的東西(子類可重寫),也可以總是不掛任何東西(父類中無實現,並且子類中未重寫或重寫無實現)。

一般情況下,鉤子方法應該不是關鍵步驟,不阻礙模板主幹執行,它是一種 「可選的、附加的」 的存在。

具體子類(concrete class):實現抽象類中所定義的抽象方法和鉤子方法,它們是演算法邏輯的乙個步驟。

蛋炒飯和炒餅絲的做飯步驟差不多,只是每次使用的原料不同,所以可以使用模板方法模式來模擬做飯的步驟。

實現abstractcooking

/**

* 抽象模板類

*/public

abstract

class

abstractcooking

/** * 1. 倒油

*/public

void

pouroil()

/** * 2. 熱油

*/public

void

heatingoil()

/** * 3. 輔料

*/public

abstract

void

poursauce()

;/**

* 4. 放主食

*/public

abstract

void

pourstaplefood()

;/**

* 5. 炒飯

*/public

void

fry(

)}

ricefriedcooking

/**

* 做蛋炒飯

*/public

class

ricefriedcooking

extends

abstractcooking

@override

public

void

pourstaplefood()

}

shreddedcakecooking

/**

* 做炒餅絲

*/public

class

shreddedcakecooking

extends

abstractcooking

@override

public

void

pourstaplefood()

}

client

public

class

client}--

----

----

----

----

-輸出--

----

----

----

-----==

====

==== 做炒公尺飯==

====

====

=放鍋倒油

**熱油

放入雞蛋、玉公尺粒、蔥、姜

放入蒸熟的公尺飯、鹽

開始炒...

====

====

== 做炒餅絲==

====

====

=放鍋倒油

**熱油

放入蔥、姜、蒜

放入餅絲、鹽、胡椒粉

開始炒.

..

原始碼click here

總結適用場景:

演算法的整體步驟很固定,但其中個別部分易變時,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現。

當多個子類存在公共的行為時,可以將其提取出來並集中到乙個公共父類中以避免**重複。

當需要控制子類的擴充套件時,模板方法只在特定點呼叫鉤子操作,這樣就只允許在這些點進行擴充套件。

servlet中也使用到了模板方法模式

自定義servlet除了要在web.xml做相應的配置外,還需繼承乙個叫httpservlet的抽象類。httpservice類提供了乙個 service() 方法,這個方法呼叫七個do方法中的乙個或幾個,完成對客戶端呼叫的響應。這些do方法需要由httpservlet的具體子類提供,因此這是典型的模板方法模式。

多執行緒aqs的實現就使用到了模板方法模式

模板方法模式

有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...

模板方法模式

模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...

模板方法模式

模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...