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