C++設計模式 - 模板方法(Template Method)
阿新 • • 發佈:2022-03-18
元件協作模式:
- 現代軟體專業分工之後的第一個結果是“框架與應用程式的劃分”,“元件協作”模式通過晚期繫結,來實現框架與應用程式之間的鬆耦合,是二者之間協作時常用的模式。
- 典型模式
- Template Method
- Observer / Event
- Strategy
Template Method 模式
動機(Motivation)
- 在軟體構建過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因(比如框架與應用之間的關係)而無法和任務的整體結構同時實現。
- 如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?
結構化軟體設計流程
面向物件軟體設計流程
早繫結與晚繫結
模式定義
定義一個操作中的演算法的骨架 (穩定),而將一些步驟延遲(變化)到子類中。Template Method使得子類可以不改變(複用)一個演算法的結構即可重定義(override 重寫)該演算法的某些特定步驟。
結構(Structure)
要點總結
-
Template Method模式是一種非常基礎性的設計模式,在面向物件系統中有著大量的應用。它用最簡潔的機制(虛擬函式的多型性)為很多應用程式框架提供了靈活的擴充套件點,是程式碼複用方面的基本實現結構。
-
除了可以靈活應對子步驟的變化外,“不要呼叫我,讓我來呼叫你”的反向控制結構是Template Method的典型應用。
-
在具體實現方面,被Template Method呼叫的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設定為protected方法。
結構化
//程式庫開發人員 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;
}
}