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