模板方法模式(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++》