1. 模式
定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
分类:行为型模式
2. 任务
任务:
- 泡一杯咖啡和一杯茶
- 泡咖啡的步骤通常如下:
a. 把水煮沸 boilWater
b. 用沸水冲泡咖啡 brewCoffeeGriends
c. 把咖啡倒进杯子 pourInCup
d. 加糖和牛奶 addSugarAndMilk - 泡茶的步骤通常如下:
a. 把水煮沸 boilWater
b. 用沸水冲泡茶叶 steepTeaBag
c. 把茶叶倒进杯子 pourInCup
d. 加柠檬 addLemon - 试图用代码方式实现
- 这两种方式的共性是什么? 有没有优化方案?
3. JS 实现
class FrameWork {
constructor() {
//类不能被实例化, 只能用于继承
if (new.target === FrameWork) {
throw Error(`pure funtion`);
}
}
boilWater() {
console.log(`boilWater`);
}
pourInCup() {
console.log(`pourInCup`);
}
init() {
this.boilWater();
this.brew();
this.pourInCup();
this.addSomeThing();
}
}
class CofferFrameWork extends FrameWork {
boilWater() {
//可以理解为重载
console.log(`boilCofferWater`);
}
brew() {
//可以理解为虚函数的实现
console.log(`brewCoffeeGriends`);
}
addSomeThing() {
//可以理解为虚函数的实现
console.log(`addSugarAndMilk`);
}
}
class TeaFrameWork extends FrameWork {
brew() {
//可以理解为虚函数的实现
console.log(`steepTeaBag`);
}
addSomeThing() {
//可以理解为虚函数的实现
console.log(`addLemon`);
}
}
let frameWork = new CofferFrameWork();
frameWork.init();