模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法特点
1、 代码复用:模板方法模式通过把通用的算法结构放在基类中,实现了代码的复用;
2、 灵活性:通过子类实现具体步骤,算法的具体实现可以在不影响整体结构的情况下发生变化;
3、 一致性:所有的具体实现都遵循相同的算法框架,保证了算法执行的一致性;
4、 易于维护:将公共部分提取到基类中,减少了代码的冗余,有助于代码的维护和扩展;
适用场景
1、 具有通用行为的算法:当你有一些通用行为的算法时,模板方法可以将通用部分提取到基类中,而具体部分由子类实现;
2、 复用代码:当你希望复用代码并只改变算法的某些具体步骤时,可以使用模板方法模式;
3、 控制子类扩展:当你需要控制子类的扩展行为,而不是让子类随意扩展时,可以使用模板方法模式;
C++案例
假设我们有一个制作咖啡和茶的程序。制作流程包括:烧水、冲泡、倒入杯中、加调料。咖啡和茶在加调料步骤上有所不同,我们可以使用模板方法模式来实现。
#include <iostream>
class CaffeineBeverage {
public:
// 模板方法
void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
virtual ~CaffeineBeverage() {}
protected:
void boilWater() {
std::cout << "Boiling water" << std::endl;
}
virtual void brew() = 0;
void pourInCup() {
std::cout << "Pouring into cup" << std::endl;
}
virtual void addCondiments() = 0;
};
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() {
Tea tea;
Coffee coffee;
std::cout << "Making tea..." << std::endl;
tea.prepareRecipe();
std::cout << "Making coffee..." << std::endl;
coffee.prepareRecipe();
return 0;
}
-
案例说明
CaffeineBeverage
是一个抽象基类,定义了制作饮料的算法骨架,即模板方法 prepareRecipe
。该方法包含了制作饮料的几个步骤,并把冲泡和加调料的具体实现推迟到子类中。
- Tea 和 Coffee 是具体的子类,分别实现了 brew 和 addCondiments 方法,这两个方法分别表示茶和咖啡的冲泡方式及调料添加方式。
- 在 main 函数中,我们创建了 Tea 和 Coffee 的实例,并调用它们的 prepareRecipe 方法来制作茶和咖啡。
总结
模板方法模式是一种行为设计模式,通过将算法的一些步骤推迟到子类中实现,从而使得算法的整体结构保持不变,同时允许子类对具体步骤进行修改。它能够有效地提高代码的复用性和灵活性,确保算法执行的一致性和可维护性。在适当的场景下使用模板方法模式,可以显著简化代码的设计和实现。
END
今天是日更的第21/100天
封面照片:_丶
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: