当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,通常考虑用模板方法模式来处理。
模版方法模式,就是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式结构图
模板方法模式基本代码
#include <iostream>
using namespace std;
class AbstractClass {
// 抽象类,其实就是一个抽象模板,定义并实现了一个模板方法。
// 这个模板方法一般是一个具体方法,给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到了子类实现。
// 顶级逻辑也可能调用一些具体的方法。
public:
void TemplateMethod() { // 模板方法,给出了逻辑骨架,而逻辑的组成是一些相应的抽象操作,推迟到子类实现.
PrimitiveOperation1();
PrimitiveOperation2();
}
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0; // 一些抽象行为,放到子类实现
virtual ~AbstractClass() {}
};
class ConcreteClassA : public AbstractClass {
// ConcreteClass实现父类所定义的一个或多个抽象方法。
// 每个AbstractClass都可以有任意多个ConcreteClass与之对应,
// 而每一个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
public:
void PrimitiveOperation1() {
cout << "ConcreteClassA: PrimitiveOperation1 & ";
}
void PrimitiveOperation2() {
cout << "PrimitiveOperation2" << endl;
}
};
class ConcreteClassB : public AbstractClass {
public:
void PrimitiveOperation1() {
cout << "ConcreteClassB: PrimitiveOperation1 & ";
}
void PrimitiveOperation2() {
cout << "PrimitiveOperation2" << endl;
}
};
int main() {
AbstractClass* aa = new ConcreteClassA();
aa->TemplateMethod(); // ConcreteClassA: PrimitiveOperation1 & PrimitiveOperation2
AbstractClass* ab = new ConcreteClassB();
ab->TemplateMethod(); // ConcreteClassB: PrimitiveOperation1 & PrimitiveOperation2
delete aa;
delete ab;
return 0;
}
模版方法模式特点
模板方法模式是通过把不变的行为搬到父类,去除子类中的重复代码来体现它的优势,提供了很好的代码复用平台。