内容简介:模板方法模式是一种只需使用继承就可以实现的非常简单的模式。模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常 在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。相同的方法都被提取到父类, 类似于Java中的继承的模式,父类定义方法, 子类重写方法首先分析比较一下泡咖啡和泡茶的流程:总结为四个步骤
模板方法模式是一种只需使用继承就可以实现的非常简单的模式。模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常 在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。相同的方法都被提取到父类, 类似于 Java 中的继承的模式,父类定义方法, 子类重写方法
8.1 Coffee and Tea
首先分析比较一下泡咖啡和泡茶的流程:
- 原料不同。一个是咖啡,一个是茶,但我们可以把它们都抽象为“饮料”。
- 泡的方式不同。咖啡是冲泡,而茶叶是浸泡,我们可以把它们都抽象为“泡”。
- 加入的调料不同。一个是糖和牛奶,一个是柠檬,但我们可以把它们都抽象为“调料”。
总结为四个步骤
- 把水煮沸
- 用沸水冲泡饮料
- 把饮料倒进杯子
- 加调料
8.2 继承的方式实现
// 饮料 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(' => 加糖和牛奶',);} 复制代码
8.3 好莱坞原则-不基于继承
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(); 复制代码
8.4 总结
模板方法模式是一种典型的通过封装变化提高系统扩展性的设计模式。在传统的面向对象语言中,一个运用了模板方法模式的程序中,子类的方法种类和执行顺序都是不变的,所以我们把这部分逻辑抽象到父类的模板方法里面。而子类的方法具体怎么实现则是可变的,于是我们把这 部分变化的逻辑封装到子类中。通过增加新的子类,我们便能给系统增加新的功能,并不需要改 动抽象父类以及其他子类,这也是符合开放封闭原则的。
以上所述就是小编给大家介绍的《JS设计模式初识(八)-模板模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
创新者的窘境(全新修订版)
克莱顿•克里斯坦森 / 胡建桥 / 中信出版社 / 2014-1-1 / 48.00元
全球商业领域中,许多企业曾叱咤风云,但面对市场变化及新技术的挑战,最终惨遭淘汰。究其原因,竟然是因为它们精于管理,信奉客户至上等传统商业观念。这就是所有企业如今都正面临的“创新者的窘境”。 在《创新者的窘境》中,管理大师克里斯坦森指出,一些看似很完美的商业动作——对主流客户所需、赢利能力最强的产品进行精准投资和技术研发——最终却很可能毁掉一家优秀的企业。他分析了计算机、汽车、钢铁等多个行业的......一起来看看 《创新者的窘境(全新修订版)》 这本书的介绍吧!