文章目录
- 模板方法模式:制作美味咖啡的标准流程
- 模板方法模式的奥秘
- 模板方法模式有什么利与弊?
- 如何使用模板方法模式来优化你的系统
- 代码实现案例
- 模板方法模式的主要优点
- 模板方法模式的主要缺点
- 模板方法模式的适用场景
- 总结
模板方法模式:制作美味咖啡的标准流程
当你走进一家咖啡店,不论点什么种类的咖啡,制作过程都遵循一定的步骤: 煮水、冲泡、倒入杯中、加入调料。这个看似简单的咖啡制作流程,实际上诠释了模板方法模式的精髓。
我们经常遇到一些操作的步骤是固定的,每个步骤的具体实现可能不同的情况。模板方法模式就像这个咖啡制作流程,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。这种模式让子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤!
模板方法模式的奥秘
模板方法模式就像一个"标准操作手册",它在一个方法中定义了一个算法的骨架,将一些步骤的实现延迟到子类中。通过这种方式,你可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤,使得系统更加灵活和可扩展。
模板方法模式有什么利与弊?
模板方法模式的优点是它提供了一种代码复用的技术,将公共行为放在父类中,而将具体的实现放在子类中。它实现了反向控制,子类可以决定如何实现算法中的某些步骤。缺点是每个不同的实现都需要一个子类,这可能会导致类的数量增加。
如何使用模板方法模式来优化你的系统
模板方法模式涉及角色
- 抽象类(AbstractClass): 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各个步骤
- 具体类(ConcreteClass): 实现原语操作以完成算法中与特定子类相关的步骤
模板方法模式步骤
- 创建一个抽象类,定义一个模板方法和一些抽象方法
- 在模板方法中定义算法的骨架,调用抽象方法
- 创建具体子类,实现抽象方法
- 客户端通过具体子类来使用算法
选择合适的模板方法模式,你就能轻松地管理算法的结构,让系统变得更加灵活和可维护!
代码实现案例
// 抽象类- 咖啡机
abstract class CoffeeMaker {
// 做咖啡
makeCoffee(): void {
// 煮水
this.boilWater();
// 冲泡
this.brewCoffeeGrounds();
// 倒入杯中
this.pourInCup();
// 加入调料
this.addCondiments();
}
// 具体方法
private boilWater(): void {
console.log("煮沸水");
}
private pourInCup(): void {
console.log("将咖啡倒入杯中");
}
// 抽象方法
protected abstract brewCoffeeGrounds(): void;
protected abstract addCondiments(): void;
}
// 具体类 - 美式咖啡
class AmericanoCoffee extends CoffeeMaker {
protected brewCoffeeGrounds(): void {
console.log("用沸水冲泡咖啡粉");
}
protected addCondiments(): void {
console.log("加入少量热水");
}
}
// 具体类 - 拿铁咖啡
class LatteCoffee extends CoffeeMaker {
protected brewCoffeeGrounds(): void {
console.log("用沸水冲泡浓缩咖啡");
}
protected addCondiments(): void {
console.log("加入蒸煮牛奶和奶泡");
}
}
// 客户端代码
console.log("制作美式咖啡:");
const americano = new AmericanoCoffee();
americano.makeCoffee();
console.log("\n制作拿铁咖啡:");
const latte = new LatteCoffee();
latte.makeCoffee();
// 输出
// 制作美式咖啡:
// 煮沸水
// 用沸水冲泡咖啡粉
// 将咖啡倒入杯中
// 加入少量热水
// 制作拿铁咖啡:
// 煮沸水
// 用沸水冲泡浓缩咖啡
// 将咖啡倒入杯中
// 加入蒸煮牛奶和奶泡
模板方法模式的主要优点
- 封装不变部分,扩展可变部分: 把不变的行为搬移到超类,去除子类中的重复代码
- 提供了一个很好的代码复用平台: 所有的子类可以共享父类中的代码
- 行为由父类控制,子类实现: 基本方法是由子类实现的,因此可以通过子类来定制行为
- 提高代码复用性: 将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
模板方法模式的主要缺点
- 每一个不同的实现都需要一个子类: 这会导致类的个数增加,使得系统更加庞大
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果: 这导致一种反向的控制结构
- 模板方法中的步骤越多,其维护就可能越困难
模板方法模式的适用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复
- 控制子类扩展: 模板方法只在特定点调用"hook"操作,这样就只允许在这些点进行扩展
总结
模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法模式通过将算法的结构定义在父类中,而将一些特定步骤的实现延迟到子类中,实现了代码复用和灵活性的平衡。这种模式提高了代码的复用性和扩展性,同时也提高了代码的可读性和可维护性。合理使用模板方法模式,可以让你的代码结构更加清晰,更易于理解和维护。
喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!
下期预告: TypeScript 设计模式之【访问者模式】