C++设计模式--模板方法模式
概述
模板方法模式(Template Method)是定義一個操作中的算法框架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法框架的結構即可重定義該算法的某些特定步驟。
模板方法模式的一個重要特征是它的定義在基類中(有時作為一個私有成員函數)并且不能改動—模板方法木事就是“堅持相同的代碼”。它調用其他基類函數(就是那些被覆蓋的虛函數)以便完成其工作,但是其他人不必直接調用這些虛函數。
模板方法的適用性
模板方法應用于一下幾種情況:
- 一次性實現一個算法的不變部分,并將可變的行為留給子類來實現。
- 各個子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。
- 控制子類擴展。
示例
#include <iostream>using namespace std;class ApplicationFramework { public:void templateMethod(){for(int i = 0 ; i < 5 ; ++i){customize1();customize2();}}virtual ~ApplicationFramework();protected:virtual void customize1() = 0;virtual void customize2() = 0;};class myApp : public ApplicationFramework { public:~myApp(); protected:void customize1(){cout << "hello ";}void customize2(){cout << "world~" << endl;} };int main() {myApp app;app.templateMethod();return 0; }ApplicationFramework::~ApplicationFramework(){} myApp::~myApp(){}以上示例可以看到,在基類中的函數templateMethod就是一個模板方法,改方法中調用了兩個虛函數,而在子類中對虛函數進行實現,在子類實例化后調用templateMethod 時,會自動調用子類中的虛函數實現。
鉤子操作
模板方法模式中的鉤子操作,它提供了缺省的行為,子類可以在必要時進行擴展,一個鉤子操作在缺省操作的通常是一個空操作。
上面這段話可能不太好理解,簡單來說,所謂的鉤子操作就是在基類中定義一個虛函數(注意,不是純虛函數)并且該虛函數有簡單的實現(也可以是空操作),那么子類在必要的時候可以重新定義并實現該虛函數然后做自己的操作。這樣便于在子類中進行擴展。這樣一來,在模板方法中就可以通過鉤子操作來知道子類中某些真正的行為。
很重要的一點是,模板方法應該指明哪些 操作是鉤子操作(可以被重定義),哪些是抽象操作(必須被重定義),要有效的重用一個抽象類,子類編寫者必須明確了解哪些操作是設計為有待重定義的。
將上面的示例修改一下:
#include <iostream>using namespace std;class ApplicationFramework { public:void templateMethod(){for(int i = 0 ; i < 5 ; ++i){customize1();customize2();}if(hookOperation()){cout << "hello everyone!";}}virtual ~ApplicationFramework();protected:virtual void customize1() = 0;virtual void customize2() = 0;//鉤子操作virtual bool hookOperation(){return false;}};class myApp : public ApplicationFramework { public:~myApp(); protected:void customize1(){cout << "hello ";}void customize2(){cout << "world~" << endl;}//鉤子操作實現bool hookOperation(){return true;} };int main() {myApp app;app.templateMethod();return 0; }ApplicationFramework::~ApplicationFramework(){} myApp::~myApp(){}對于有多個子類實現時,鉤子操作就可以便于子類中的擴展啦。
總結
以上是生活随笔為你收集整理的C++设计模式--模板方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++设计模式--命令模式(Comman
- 下一篇: C++ warning:’xxx‘ ha