模板方法模式
2020-11-01 本文已影响0人
小宇cool
1. 模板方法模式
1.1 定义
模板方法模式(Template Method): 父类定义一组操作算法骨架, 而将一些实际实现步骤延迟到子类中, 使得子类可以在不改变父类算法结构的同时重新定义算法中某些实现步骤
模板方法模式是将代码复用的基础基础, 在写类库的时候非常重要, 通常我们会在一个抽象类公开定义了执行它的方法的方式/模板, 它的子类方法可以按照需要重写方法实现, 但调用将以抽象类中定义的方式进行.
1.2 作用
- 提高代码复用性, 提高代码的可维护性.
- 将通用算法抽象出来由父类控制, 子类实现具体的操作步骤
- 封装不变部分, 便于扩展可变部分
1.3 应用场景
- 场景一
现实生活中, 泡咖啡和泡茶一般都有以下几个步骤
泡茶: 烧开水-> 用沸水浸泡茶叶-> 倒入杯子->加柠檬
泡咖啡: 烧开水->用沸水泡咖啡->倒入杯子->加糖或牛奶
我们可以发现两个场景都有非常类型的步骤, 此时利用模板方法模式来实现这个场景就非常合适
// 把泡咖啡和泡茶的共同点抽出来
class Beverage{
boilWater(){
console.log("把水煮沸");
}
brew(){} // 泡饮料或者 咖啡
pourInCup(){}// 倒入杯子
addCondiments(){}// 加入调料
init(){
this.boilWater();
this.brew();
this.pourInCup();
this.addCondiments()
}
}
// 继承父类的模板, 通用部分不动, 特殊的地方重写父类的方法
class Tea extends Beverage{
brew() {
console.log("用沸水浸泡茶叶");
} // 泡饮料或者 咖啡
pourInCup() {
console.log('把茶倒入杯子');
}// 倒入杯子
addCondiments() {
console.log('加柠檬');
}// 加入调料
}
new Tea().init()// 开始泡茶
上面是泡茶的一般步骤, 但是有可能会有特殊情况, 比如有的人可能不会加调料, 遇到这种情况,我们需要使用钩子方法来隔离有变化的步骤
class newBeverage{
boilWater() {
console.log("把水煮沸");
}
brew() {
throw new Error('子类必须重写brew方法')
} // 泡饮料或者 咖啡
pourInCup() {
throw new Error('子类必须重写pourInCup方法')
}// 倒入杯子
addCondiments() { // 加入调料
throw new Error('子类必须重写paddCondiments方法')
}
customerWantsCondiments (){
return true // 默认需要调料
}
init() {
this.boilWater();
this.brew();
this.pourInCup();
//如果钩子返回了true, 则需要调料
if(this.customerWantsCondiments()){
this.addCondiments()// 第四步成为了可选方法
}
}
}
总结: 模板方法是典型的行为型模式,是一种优化代码结构的重要手段,主要应用在有多个子类有共有的方法,且逻辑相同, 重要的. 复杂的方法, 可以考虑作为模板方法模式,