设计模式:7. 模板方法模式
你开了一家饮品店,目前有两个饮品,制作步骤如下:
- 咖啡冲泡法
a. 把水煮沸
b. 用沸水冲泡咖啡
c. 把咖啡倒进杯子
d. 加糖和牛奶 - 茶冲泡法
a. 把水煮沸
b. 用沸水浸泡茶叶
c. 把茶倒进杯子里
d. 加柠檬
可以看到,这两个饮品的制作方法大体上是一样的,只有第二步需要冲泡的东西和第四步加入的调料有所不同。其他两步“把水煮沸”和“倒进杯子”动作完全一样。
我们可以把整个制作步骤设计成一个抽象类,制作成一个模板,相同的动作直接在抽象类中实现,而不同的部分,由子类自己实现。
class Beverage
{
public:
void prepareRecipe()
{
boilWater();
brew();
pourInCup();
addCondiments();
}
virtual void brew() = 0;
virtual void addCondiments() = 0;
void boilWater()
{
std::cout << "Boiling water" << std::endl;
}
void pourInCup()
{
std::cout << "Pouring into cup" << std::endl;
}
};
class Tea: public Beverage
{
public:
void brew() override
{
std::cout << "Steeping the tea" << std::endl;
}
void addCondiments() override
{
std::cout << "Adding Lemon" << std::endl;
}
};
class Coffee: public Beverage
{
public:
void brew() override
{
std::cout << "Dripping Coffee through filter" << std::endl;
}
void addCondiments() override
{
std::cout << "Adding Sugar and Milk" << std::endl;
}
};
如果再有其他的饮品,也可以按照这个模板制作。
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

浙公网安备 33010602011771号