模板方法模式是一种只需使用继承就能够实现的很是简单的模式。模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。一般 在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中全部方法的执行顺序。子类经过继承这个抽象类,也继承了整个算法结构,而且能够选择重写父类的方法。相同的方法都被提取到父类, 相似于Java中的继承的模式,父类定义方法, 子类重写方法算法
首先分析比较一下泡咖啡和泡茶的流程: 设计模式
总结为四个步骤bash
// 饮料
function Beverage() {}
Beverage.prototype.boilWater = () => {
console.log(' => 把水煮沸');
}
Beverage.prototype.brew = () => { throw new Error('子类必须重写此方法'); }
Beverage.prototype.pourInCup = () => { throw new Error('子类必须重写此方法'); }
Beverage.prototype.addCondiments = () => { throw new Error('子类必须重写此方法'); }
Beverage.prototype.init = function() {
this.boilWater();
this.brew();
this.pourInCup();
this.addCondiments();
}
function Coffee() {}
Coffee.prototype = new Beverage();
Coffee.prototype.brew = () => { console.log(' => 泡咖啡',);}
Coffee.prototype.pourInCup = () => { console.log(' => 向杯子倒咖啡',);}
Coffee.prototype.addCondiments = () => { console.log(' => 加糖和牛奶',);}
复制代码
function Beverage(params) {
const boilWater = () => { console.log(' => 把水煮沸',); }
const brew = params.brew && (() => { throw new Error('子类必须重写此方法'); });
const pourInCup = params.pourInCup && (() => { throw new Error('子类必须重写此方法'); });
const addCondiments = params.addCondiments && (() => { throw new Error('子类必须重写此方法'); });
const F;
F.prototype.init = () => {
boilWater();
brew();
pourInCup();
addCondiments();
}
return F;
}
const Coffee = Beverage({
brew: () => { console.log(' => 泡咖啡',);},
pourInCup: () => { console.log(' => 向杯子倒咖啡',);},
addCondiments: () => { console.log(' => 加糖和牛奶',);}
});
const Tea = Beverage({
brew: () => { console.log(' => 泡茶',);},
pourInCup: () => { console.log(' => 向杯子倒茶',);},
addCondiments: () => { console.log(' => 柠檬',);}
});
const coffee = new Coffee();
coffee.init();
const tea = new Tea();
tea.init();
复制代码
模板方法模式是一种典型的经过封装变化提升系统扩展性的设计模式。在传统的面向对象语言中,一个运用了模板方法模式的程序中,子类的方法种类和执行顺序都是不变的,因此咱们把这部分逻辑抽象到父类的模板方法里面。而子类的方法具体怎么实现则是可变的,因而咱们把这 部分变化的逻辑封装到子类中。经过增长新的子类,咱们便能给系统增长新的功能,并不须要改 动抽象父类以及其余子类,这也是符合开放封闭原则的。框架