内容简介:模板方法模式是一种只需使用继承就可以实现的非常简单的模式。模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常 在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。相同的方法都被提取到父类, 类似于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设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
企业应用架构模式
Martin Fowler / 王怀民、周斌 / 机械工业出版社 / 2010-4 / 59.00元
《企业应用架构模式》作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的、关于解决方案的、不可或缺的手册。《企业应用架构模式》获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖。《企业应用架构模式》分为两大部分。第一部分是关于如何开发企业应用的简单介绍。第二部分是《企业应用架构模式》的主体......一起来看看 《企业应用架构模式》 这本书的介绍吧!