一、模式动机
为了提高代码复用,定义了算法的步骤,而这些步骤的具体实现延迟到子类中。
二、模式定义
模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变 算法结构的情况下,重新定义算法中的某些步骤。UML图如下:
三、模式示例
下图是星巴兹咖啡师傅的训练手册,用模板方法模式来实现。
C++代码实现:
#include <iostream>
using namespace std;
class CaffeeineBeverage
{
public:
CaffeeineBeverage();
~CaffeeineBeverage();
void boilWater() { cout << "把水煮沸" << endl; }
void pourInCup() { cout << "倒进杯子" << endl; }
virtual void brew() = 0;
virtual void addCondiments() = 0;
void preparreRecip() { boilWater(); brew(); pourInCup(); addCondiments(); }
private:
};
CaffeeineBeverage::CaffeeineBeverage()
{
}
CaffeeineBeverage::~CaffeeineBeverage()
{
}
class Tea : public CaffeeineBeverage
{
public:
Tea();
~Tea();
void brew() { cout << "用沸水浸泡茶叶" << endl; }
void addCondiments() { cout << "加柠檬" << endl; }
private:
};
Tea::Tea()
{
}
Tea::~Tea()
{
}
class Coffee : public CaffeeineBeverage
{
public:
Coffee();
~Coffee();
void brew() { cout << "用沸水冲泡咖啡" << endl; }
void addCondiments() { cout << "加糖和牛奶" << endl; }
private:
};
Coffee::Coffee()
{
}
Coffee::~Coffee()
{
}
int _tmain(int argc, _TCHAR* argv[])
{
Tea MyTea;
Coffee MyCoffee;
MyTea.preparreRecip();
MyCoffee.preparreRecip();
system("Pause");
return 0;
}
运行结果:
四、分析总结
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以抽象的,有子类负责实现。这样可以确保算法的结构保持不变,同时由子类提供部分实现。