設計模式—Template Method(模板方法)
阿新 • • 發佈:2018-12-17
動機(Motivation)
- 在軟體構建過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因(比如框架與應用之間的關係)而無法和任務的整體結構同時實現。
- 如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?
模式定義
定義一個操作中的演算法的骨架 (穩定) ,而將一些步驟延遲 (變化) 到子類中。 Template Method使得子類可以不改變(複用)一個演算法的結構即可重定義(override 重寫)該演算法的 某些特定步驟。 ——《 設計模式》 GoF
結構化設計流程程式碼(早繫結)
//程式庫開發人員 class Library{ public: void Step1(){ //... } void Step3(){ //... } void Step5(){ //... } };
//應用程式開發人員
class Application{
public:
bool Step2(){
//...
}
void Step4(){
//...
}
};
int main()
{
Library lib();
Application app();
lib.Step1();
if (app.Step2()){
lib.Step3();
}
for (int i = 0; i < 4; i++){
app.Step4();
}
lib.Step5();
}
面向物件軟體設計流程程式碼(晚繫結)
//程式庫開發人員 class Library{ public: //穩定 template method void Run(){ Step1(); if (Step2()) { //支援變化 ==> 虛擬函式的多型呼叫 Step3(); } for (int i = 0; i < 4; i++){ Step4(); //支援變化 ==> 虛擬函式的多型呼叫 } Step5(); } virtual ~Library(){ } protected: void Step1() { //穩定 //..... } void Step3() {//穩定 //..... } void Step5() { //穩定 //..... } virtual bool Step2() = 0;//變化 virtual void Step4() =0; //變化 };
//應用程式開發人員
class Application : public Library {
protected:
virtual bool Step2(){
//... 子類重寫實現
}
virtual void Step4() {
//... 子類重寫實現
}
};
int main()
{
Library* pLib=new Application();
lib->Run();
delete pLib;
}
}
要點總結
- Template Method模式是一種非常基礎性的設計模式,在面向物件系統中有著大量的應用。它用最簡潔的機制(虛擬函式的多型性) 為很多應用程式框架提供了靈活的擴充套件點,是程式碼複用方面的基本實現結構。
- 除了可以靈活應對子步驟的變化外, “不要呼叫我,讓我來呼叫你” 的反向控制結構是Template Method的典型應用。
- 在具體實現方面,被Template Method呼叫的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設定為protected方法。