定义
模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。这样,模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
核心思想
将算法的具体实现步骤推迟到子类中进行,而不是在基类中实现。这使得代码复用更方便,同时也增加了灵活性和可扩展性。
结构
模板方法模式主要包括以下几个部分:
- 抽象类(Abstract Class) :定义了一个模板方法以及一些抽象的基本方法。模板方法包含算法的骨架,调用基本方法完成具体的工作。
- 具体类(Concrete Class) :实现抽象类中的抽象方法,从而完成算法中的具体步骤。
代码示例
#include <iostream>
// 抽象类:饮料
class Beverage
{
public:
// 模板方法
void prepareRecipe()
{
boilWater();
brew();
pourInCup();
addCondiments();
}
// 抽象方法,子类实现在此有区别
virtual void brew() = 0;
virtual void addCondiments() = 0;
// 具体方法
void boilWater()
{
std::cout << "Bioling water" << std::endl;
}
void pourInCup()
{
std::cout << "Pouring into cup" << std::endl;
}
virtual ~Beverage() = default;
};
// 具体类:茶
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;
}
};
int main()
{
Beverage* tea = new Tea();
tea->prepareRecipe();
delete tea;
Beverage* coffee = new Coffee();
coffee->prepareRecipe();
delete coffee;
system("pause");
return 0;
}
应用场景
-
多个子类有公有的方法,并且逻辑基本相同时。
-
重要的、复杂的方法可以由多个子类中的具体实现来决定。
-
代码复用的需求。