一、模式定义
模板方法模式,Template Method Pattern.
Define the skeleton of an algoritithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,是使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二、模式详解
图 1 - 模板方法通用类图
类图中的 AbstractClass 称为抽象模板,其方法分为两大类:
- 基本方法
基本方法也叫做基本操作,由子类实现的方法,并且在模板方法被调用。 - 模板方法
可以有一个或几个,一般是一个具体的方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
为了防止恶意操作,一般模板方法不允许被覆写。
Concrete1和Concrete2称为具体模板,负责实现父类(即抽象模板类)的一个多多个抽象方法,也就是父类定义的基本方法在子类中得以实现。
三、代码示例
#include <iostream>
using namespace std;
class CCar
{
public:
CCar();
virtual ~CCar();
void TestRun()
{
Start();
Alarm();
Stop();
}
private:
virtual void Start() = 0;
virtual void Stop() = 0;
virtual void Alarm() = 0;
};
CCar::CCar()
{}
CCar::~CCar()
{}
class CBenz:public CCar
{
public:
CBenz() {}
~CBenz() {}
private:
void Start()
{
cout << "奔驰车启动..." << endl;
}
void Stop()
{
cout << "奔驰车停止..." << endl;
}
void Alarm()
{
cout << "奔驰车鸣喇叭..." << endl;
}
};
class CBWM:public CCar
{
public:
CBWM() {}
~CBWM() {}
void Start()
{
cout << "宝马车启动..." << endl;
}
void Stop()
{
cout << "宝马车停止..." << endl;
}
void Alarm()
{
cout << "宝马车鸣喇叭..." << endl;
}
};
int main()
{
CCar * pBwm = new CBWM();
pBwm->TestRun();
CCar * pBenz = new CBenz();
pBenz->TestRun();
return 0;
}