前面的時間學習了5種建立型設計模式和7種結構型設計模式,現在開始學習行為型的設計模式
在模板模式(template pattern)中,乙個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。
意圖:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
主要解決:一些方法通用,卻在每乙個子類都重新寫了這一方法。
何時使用:有一些通用的方法。
如何解決:將這些通用演算法抽象出來。
關鍵**:在抽象類實現,其他步驟在子類實現。
應用例項:
抽象基類:abstractclass:抽象基類,定義演算法的輪廓
解析:templatemethod的關鍵在於在基類中定義了乙個演算法的輪廓,但是演算法每一步具體的實現留給了派生類.但是這樣也會造成設計的靈活性不高的缺點,因為輪廓已經定下來了要想改變就比較難了,這也是為什麼優先採用聚合而不是繼承的原因。
1、對應uml結構圖的實現的**
2、乙個例項,進一步加深理解#include
using namespace std;
//抽象基類,定義演算法的輪廓
class abstractclass
virtual ~abstractclass(){}
//這個函式中定義了演算法的輪廓
void templatemethod()
protected:
//純虛函式;由派生類實現之
virtual
void
primitiveoperation1()=0;
virtual
void primitiveoperation2()=0;
};//繼承自abstractclass,實現演算法
class concreteclass:public abstractclass
virtual ~concreteclass(){}
protected:
virtual
void
primitiveoperation1()
驗證輸出:cricket game initialized! start playing.//步驟 1 建立乙個抽象類,它的模板方法被設定為 final。
class game
virtual ~game(){}
//這個函式中定義了演算法的輪廓
void play()
protected:
//純虛函式;由派生類實現之
virtual
void
initialize()=0;
virtual
void startplay()=0;
virtual
void endplay()=0;
};//步驟 2 建立擴充套件了上述類的實體類。
class cricket:public game
virtual ~cricket(){}
protected:
void
endplay()
virtual ~football(){}
protected:
void
endplay()
}
cricket game started. enjoy the game!
cricket game finished!
football game initialized! start playing.
football game started. enjoy the game!
football game finished!
設計模式學習 模板方法模式
型別 行為模式 模板方法模式定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些 特定步驟。uml圖 新建賽車的父類 package car package public class car parent public void setsp...
設計模式學習 模板方法模式
1.雜言 設計模式,現在覺得每種模式像工業行業的一些典型零件。這些零件也可以變種出很多類似零件。吧這些零件組合起來,就成了一台機器。好吧,我現在是這麼理解的。一般 結構都是,一層呼叫一層,就是一般都是頂層的呼叫底層的。但模板方法確實反過來的,有父類呼叫子類的方法。這個聽說又牽扯到啥好萊塢原則。對於這...
設計模式學習 模板方法模式
模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟.父類就應該要成為子類的模板,所有重複的 都應該要上公升到父類中,而不是讓每個子類都取重複,重要,複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細...