模板方法模式(Template Method):定義一個操作中的演算法的骨架,而將一些方法實現延遲到子類。模板方法使得子類可以不改變一個演算法的結構即可以重定義該演算法的某些特定步驟。
通俗一點講,假設一個類或者演算法實現需要調用函數f1、f2、f3,調用的順序確定,為f1,f2,f3,但是對於不同的類,不同的演算法,f1、f2、f3的實現過程會有不同;
那麼模板方法怎麼解決問題的呢?
首先,定義一個函數將f1、f2、f3按確定的順序封裝起來,並將該函數定義為virtual 函數;其次,將函數f1、f2、f3定義為pure virtual,函數f1、f2、f3的具體實現過程由子類來完成;最後,基類由於定義pure virtual函數而成為抽象類別,但是基類定義了演算法或者函數的調用過程(及程式架構),衍生類別繼承基類,實現pure virtual 函數f1、f2、f3從而完成,衍生類別都有相同的執行過程,但是每個過程的細節自己定義。
#include<iostream>#include<string>using namespace std;class GameCharacter{public:virtual int healthCalculate();virtual void doBefore() = 0;virtual void doAfter() = 0;virtual void calculate() = 0;};int GameCharacter::healthCalculate(){doBefore();//具體操作過程calculate();doAfter();return 1;//此處僅僅是為了程式設計之便,無特殊含義}class EvilBadGuy : public GameCharacter{public:void doBefore();void doAfter();void calculate();};void EvilBadGuy::calculate(){cout << "EvilBadGuy calculate process " << endl;}void EvilBadGuy::doBefore(){cout << "EvilBadGuy do before function " << endl;}void EvilBadGuy::doAfter(){cout << "EvilBadGuy do after function" << endl;}class Angel : public GameCharacter{public:void doBefore();void doAfter();void calculate();};void Angel::calculate(){cout << "Angel calculate process " << endl;}void Angel::doBefore(){cout << "Angel do before function " << endl;}void Angel::doAfter(){ cout << "Angel do after function " << endl;}int main(int argc, char **argv){GameCharacter *ev = new EvilBadGuy;ev->healthCalculate();GameCharacter *angel = new Angel;angel->healthCalculate();delete ev;delete angel;system("pause");return 0;}
參考資料:
1、《大話設計模式》
2、《effective c++》