今天要学的是模板方法模式。
模板方法模式(TemplateMethod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
下面是模板方法模式的UML图:
下面是C++实现的代码:
/*
* initm.com
* 作者:Stupid
* 时间:2017-10-23 21:44
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为模板模式的基本结构代码。
*/
#include <QCoreApplication>
#include <iostream>
class AbstructClass
{
public:
virtual ~AbstructClass(){;}
virtual void PrimitiveOpeartion1()=0;
virtual void PrimitiveOpeartion2()=0;
void TemplateMethod(){
PrimitiveOpeartion1();
PrimitiveOpeartion2();
std::cout << "TemplateMethod Called!" << std::endl;
}
};
class ConcreteClass1: public AbstructClass
{
public:
virtual void PrimitiveOpeartion1()override final{
std::cout << "ConcreteClass1-PrimitiveOpeartion1 Called!" << std::endl;
}
virtual void PrimitiveOpeartion2()override final{
std::cout << "ConcreteClass1-PrimitiveOpeartion2 Called!" << std::endl;
}
};
class ConcreteClass2: public AbstructClass
{
public:
virtual void PrimitiveOpeartion1()override final{
std::cout << "ConcreteClass2-PrimitiveOpeartion1 Called!" << std::endl;
}
virtual void PrimitiveOpeartion2()override final{
std::cout << "ConcreteClass2-PrimitiveOpeartion2 Called!" << std::endl;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
AbstructClass* abstructClass = new ConcreteClass1;
abstructClass->TemplateMethod();
delete abstructClass, abstructClass=nullptr;
//////////////////////////////////////////////////////
abstructClass = new ConcreteClass2;
abstructClass->TemplateMethod();
delete abstructClass, abstructClass=nullptr;
return a.exec();
}
模板方法模式可以不必在基类中考虑具体的实现,而把实现推迟到具体的子类中实现。也把子类中重复的部分整合到了基类中,减少了子类中的重复,做到不变的部分在基类中,变的部分在子类中。