模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以再不改变一个算法的结构即可重新定义该算法的某些特定步骤。通过把不变的行为搬移到基类中,去除了子类的重复代码,提供了一个很好的代码复用解决方案。
通用模板方法的UML类图
模板方法是将原来不变的行为和可变的行为剥离开,将不变的行为剥离到基类中,由基类提供一个模板方法,模板方法设置了算法的骨架,而各家的各个实现步骤和细节由各个子类具体实现。
抽象类AbstractClass 提供了一个模板方法定义算法骨架,声明了2个抽象方法为算法的具体实现细节,该抽象方法由各自的子类实现。
具体的类ConcreteClass 实现抽象方法,完成算法的具体步骤细节实现。
下面是通过的模板方法代码:
Template.h
class AbstractClass
{
public:
virtual void PrimitiveOperation1()=0;
virtual void PrimitiveOperation2()=0;
void TemplateMethod();
virtual ~AbstractClass(){}
};
class ConcreteClass1 :public AbstractClass
{
public:
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
~ConcreteClass1(){}
};
class ConcreteClass2 :public AbstractClass
{
public:
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
~ConcreteClass2(){}
};
Template.cpp
#include "Template.h"
#include <iostream>
void AbstractClass::TemplateMethod()
{
//模板方法定义算法的骨架
PrimitiveOperation1();
PrimitiveOperation2();
}
void ConcreteClass1::PrimitiveOperation1()
{
std::cout << "算法步骤1" << std::endl;
}
void ConcreteClass1::PrimitiveOperation2()
{
std::cout << "算法步骤2" << std::endl;
}
void ConcreteClass2::PrimitiveOperation1()
{
std::cout << "组成部分1" << std::endl;
}
void ConcreteClass2::PrimitiveOperation2()
{
std::cout << "组成部分2" << std::endl;
}
客户端代码:
#include "Template.h"
int main()
{
AbstractClass *AC1 = new ConcreteClass1();
AC1->TemplateMethod();
AbstractClass *AC2 = new ConcreteClass2();
AC2->TemplateMethod();
delete AC1;
delete AC2;
}
程序运行结果: