模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
1 一次性實現乙個演算法的不變部分,並將可變的行為留給子類來實現。
2 將各子類中公共的行為提取出來並集中到乙個公共父類中以避免**重複。
3 控制子類擴充套件。模板方法只在特定點呼叫"hook"操作,這樣就只允許在這些點進行擴充套件。
1 抽象類(父類)主導一切,它擁有演算法,而且保護這個演算法。
2 演算法只存在於乙個地方,所以容易修改
3 抽象基類專注在演算法本身,而由子類提供完整的實現
4 模板方法是一種**復用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為
5 模板方法模式導致一種反向的控制結構,這種結構有時被稱為「好萊塢原則」,即「別打**給我們,我們會打**給你」,通過乙個父類呼叫其子類的操作(而不是相反的子類呼叫父類)
每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,系統也更加抽象,但是更加符合「單一職責原則」,使得類的內聚性得以提高。
鉤子是一種被宣告在抽象類中的方法,但只有空的或者預設的實現。鉤子的存在,可以讓子類有能力對演算法的不同點進行掛鉤。要不要掛鉤,由子類決定。
例如
#include class caffeinebeveragewithhook
}virtual void brew() = 0;
void addcondiments() = 0;
void boilwater()
void pourincup()
// 這就是乙個鉤子,子類可以覆蓋這個方法,但不見得一定要這麼做
virtual bool customerwantscondiments()
}
使用鉤子的目的:
1 鉤子可以讓子類實現演算法中可選的部分,或者在鉤子對於子類的實現並不重要的時候,子類可以對此鉤子置之不理。
2 讓子類能夠有機會對模板方法中某些即將發生的(或剛剛發生的)步驟做出反應。比方說,名為justreorderedlist()的鉤子方法允許子類在內部列表重新組織後執行某些動作(例如在螢幕上顯示資料)。
3 鉤子也可以讓子類有能力為其抽象類做一些決定
1 策略模式的目的是封裝演算法,它定義乙個演算法家族,並讓這些演算法可以互換,客戶可以輕易的使用不同的演算法。而模板方法是要定義乙個演算法的大綱,而由子類定義其中某些步驟的內容。這麼一來, 在演算法中的個別步驟可以有不同的實現細節,但是演算法的結構依然維持不變。
2 策略模式使用組合,而模板方法模式使用繼承。由於使用繼承,模板方法模式對演算法有更多的控制權,而且不會重複**。事實上,除了極少的一部分之外,模板方法模式的演算法的每乙個部分都是相同的,所以模板方法模式比策略模式更有效率。而策略模式使用物件組合,更有彈性。利用策略模式,客戶可以在執行時改變他們的演算法,而客戶所需要做的,只是改用不同的策略物件罷了。
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...