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