一、UML图
二、包含的角色
AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级的逻辑骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类中实现。
ConcreteClass,实现父类所定义的一个或者多个抽象方法。每个AbstractClass都可以有任意多个ConcreteClass与之对应,而每个ConcreteClass都可以给出这些抽象方法。
三、特点
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
1、模板方法模式就是通过把不变行为搬移到超类,去除子类的中的重复代码来体现它的又是。
2、模板方法模式就是提供一个很好的代码复用平台
3、当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们可以通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
四、代码实现
AbstractClass类
#pragma once
class AbstractClass
{
public:
virtual ~AbstractClass() {}
void TemplateMethod() const
{
this->PrimitiveOperation1();
this->PrimitiveOperation2();
}
protected:
virtual void PrimitiveOperation1() const = 0;
virtual void PrimitiveOperation2() const = 0;
};
ConcreteClass1,ConcreteClass2 类似如下
#pragma once
#include "AbstractClass.h"
#include <iostream>
using std::cout;
using std::endl;
class ConcreteClass1 : public AbstractClass
{
public:
protected:
void PrimitiveOperation1() const override
{
std::cout << "ConcreteClass1 says: Primitive Operation1\n";
}
void PrimitiveOperation2() const override
{
std::cout << "ConcreteClass1 says: Primitive Operation2\n";
}
};
main调用
#include "ConcreteClass1.h"
#include "ConcreteClass2.h"
int main (int argc, char **argv) {
AbstractClass *d1 = new ConcreteClass1();
d1->TemplateMethod();
AbstractClass *d2 = new ConcreteClass2();
d2->TemplateMethod();
delete d1;
delete d2;
return 0;
}