模板方法模式(Template Method)是一种行为型设计模式,它定义了一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重定义某些特定的步骤。
特点:
1、定义算法框架:在父类中定义了算法的结构,子类负责实现具体的步骤。
2、代码复用:共享算法的公共部分,避免代码重复。
3、灵活性:允许子类重写部分步骤,增强灵活性。
适用场景:
1、当一个算法的整体结构不变,但某些步骤可以由子类实现时。
2、需要控制子类的扩展时。
示例:
假设有一个制作饮料的流程,包含“煮水”、“泡茶”或“泡咖啡”等步骤。
//g++ -o test main.cpp
#include <iostream>
class CaffeineBeverage {
public:
// 模板方法
void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
protected:
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 CaffeineBeverage {
protected:
void brew() override {
std::cout << "Steeping the tea" << std::endl;
}
void addCondiments() override {
std::cout << "Adding lemon" << std::endl;
}
};
class Coffee : public CaffeineBeverage {
protected:
void brew() override {
std::cout << "Dripping coffee through filter" << std::endl;
}
void addCondiments() override {
std::cout << "Adding sugar and milk" << std::endl;
}
};
int main() {
CaffeineBeverage* tea = new Tea();
tea->prepareRecipe();
CaffeineBeverage* coffee = new Coffee();
coffee->prepareRecipe();
delete tea;
delete coffee;
return 0;
}
在这个例子中,CaffeineBeverage 类定义了一个制作饮料的模板方法 prepareRecipe(),并在其中调用了一些基本步骤。具体的冲泡和调味步骤由 Tea 和 Coffee 子类实现,从而实现了代码的复用和灵活性。