定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. 动机
在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用过程中,对架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作pdf)。我们抽取他们的共同点:这些操作的固定顺序,把他放到我们的父类里;他们的变化点:这些个具体的操作,去留给不同的子类去实现。这个就是模板方法模式,他定义一个操作中的算法的骨架(例子中的固定的操作顺序),而将一些步骤延迟到子类中(例子中的多种压缩文件的解压缩)。
Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。是一种比较简单的设计模式,但却是代码复用的一项基本技术,在类库中尤其重要,使用的也比较普遍。
3.结构
• A b s t r a c t C l a s s(抽象类,如A p p l i c a t i o n)
— 定义抽象的原语操作( primitive operation),具体的子类将重定义它们以实现一个算法的各步骤。
— 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在A b s t r a c t C l a s s或其他对象中的操作。
• C o n c r e t e C l a s s(具体类,如M y A p p l i c a t i o n)
— 实现原语操作以完成算法中与特定子类相关的步骤。
4.举例
#ifndef TEMMTD
#define TEMMTD
#include <iostream>
using std::cout;
using std::endl;
class Vehicle{
public:
virtual void StartUp(){
cout<<"Start Up ";
}
virtual void Drive(){
cout<<"Drive the ";
}
};
class Car : public Vehicle{
public:
virtual void StartUp(){
Vehicle::StartUp();
ShowName();
}
virtual void Drive(){
Vehicle::Drive();
ShowName();
}
void ShowName(){
cout<<"the car."<<endl;
}
};
class Bus : public Vehicle{
public:
virtual void StartUp(){
Vehicle::StartUp();
ShowName();
}
virtual void Drive(){
Vehicle::Drive();
ShowName();
}
void ShowName(){
cout<<"the bus."<<endl;
}
};
#endif
#include "TemplateMethod.h"
int main(){
Vehicle* pVehA=new Car;
Vehicle* pVehB=new Bus;
pVehA->Drive();
pVehA->StartUp();
pVehB->Drive();
pVehB->StartUp();
delete pVehA;
delete pVehB;
}