1、引
- 剛參加工作時,一大牛同事寫了一個C++的下位機框架,今天突然又記起來了,裏面用了好幾個設計模式的方法,其中之一就是模板模式,還有單件模式。這裏把模板模式記錄一下。
2、定義
- 在模板模式(Template Pattern)中,定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。大牛的骨架就是消息執行的過程是定好的,但是每種消息模塊的執行是不一樣的。
3、UML圖
4、C++實例
簡化一下大牛的框架
class CMsgModule
{
public:
void Algorithms();//算法骨架在這裏定義
protected:
virtual void loadMsg() = 0;
virtual void exeMsg() = 0;
virtual void afterExeMsg() = 0;
};
//消息的執行都經過這三步
void CMsgModule::Algorithms()
{
loadMsg();
exeMsg();
afterExeMsg();
}
派生的具體消息模塊
class CMsgModuleA :public CMsgModule
{
protected:
virtual void loadMsg();
virtual void exeMsg();
virtual void afterExeMsg();
};
class CMsgModuleB :public CMsgModule
{
protected:
virtual void loadMsg();
virtual void exeMsg();
virtual void afterExeMsg();
};
//每個具體的消息模塊的具體接口都會有自己特定的算法
void CMsgModuleA::loadMsg()
{
qDebug() << "Module A"<<" load msg";
}
void CMsgModuleA::exeMsg()
{
qDebug() << "Module A"<<" exe msg";
}
void CMsgModuleA::afterExeMsg()
{
qDebug() << "Module A"<<" after exe msg";
}
void CMsgModuleB::loadMsg()
{
qDebug() << "Module B"<<" load msg";
}
void CMsgModuleB::exeMsg()
{
qDebug() << "Module B"<<" exe msg";
}
void CMsgModuleB::afterExeMsg()
{
qDebug() << "Module B"<<" after exe msg";
}
主循環裏:
QVector<CMsgModule* > vec ;
vec << new CMsgModuleA;
vec << new CMsgModuleB;
for(int i = 0 ;i < vec.size();i++)
{
vec.at(i)->Algorithms();
}
5、總結
1、封裝不變部分,擴展可變部分。
2、提取公共代碼,便於維護。
3、行爲由父類控制,子類實現。
4、每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大
6、參考資料
https://www.tutorialspoint.com/design_pattern/template_pattern.htm
https://en.wikipedia.org/wiki/Template_method_pattern
http://www.oodesign.com/template-method-pattern.html