软件设计的一个重要的思想方法是软件重用,软件重用也体现在代码重用上。模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式提供了一个很好的代码复用平台,使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
1.模式适用性
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
- 控制子类的扩展,使子类的扩展在特定点起作用。
2.模式结构
由图2可知,模板方法模式包含如下两个角色:
(1) AbstractClass(抽象类:在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
(2) ConcreteClass(具体子类:它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
3.实现
#include <iostream>
using namespace std;
class AbstrctClass
{
public:
virtual void PrimitiveOperation1(){};
virtual void PrimitiveOperation2(){};
void TemplateMethod()
{
cout << "do something" << endl;
PrimitiveOperation1();
PrimitiveOperation2();
cout << "we finish" << endl;
}
};
class ConcreteClassA : public AbstrctClass
{
public:
void PrimitiveOperation1()
{
cout << "A step1" << endl;
}
void PrimitiveOperation2()
{
cout << "A step2" << endl;
}
};
class ConcreteClassB : public AbstrctClass
{
public:
void PrimitiveOperation1()
{
cout << "B step1" << endl;
}
void PrimitiveOperation2()
{
cout << "B step2" << endl;
}
};
int main(int argc,char *argv[])
{
AbstrctClass *c;
c = new ConcreteClassA();
c->TemplateMethod();
delete c;
c = new ConcreteClassB();
c->TemplateMethod();
delete c;
return 0;
}