一、定义
模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类
模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。
二、示例
coffee or tea
(1) 把水煮沸
(2) 用沸水浸泡茶叶
(3) 把茶水倒进杯子
(4) 加柠檬
/* 抽象父类:饮料 */var beverage = function(){};// (1) 把水煮沸beverage.prototype.boilwater = function() { console.log(把水煮沸);};// (2) 沸水浸泡beverage.prototype.brew = function() { throw new error(子类必须重写brew方法);};// (3) 倒进杯子beverage.prototype.pourincup = function() { throw new error(子类必须重写pourincup方法);};// (4) 加调料beverage.prototype.addcondiments = function() { throw new error(子类必须重写addcondiments方法);};/* 模板方法 */beverage.prototype.init = function() { this.boilwater(); this.brew(); this.pourincup(); this.addcondiments();}/* 实现子类 coffee*/var coffee = function(){};coffee.prototype = new beverage();// 重写非公有方法coffee.prototype.brew = function() { console.log(用沸水冲泡咖啡);};coffee.prototype.pourincup = function() { console.log(把咖啡倒进杯子);};coffee.prototype.addcondiments = function() { console.log(加牛奶);};var coffee = new coffee();coffee.init();
通过模板方法模式,在父类中封装了子类的算法框架。这些算法框架在正常状态下是适用大多数子类的,但也会出现“个性”子类。
如上述流程,加调料是可选的。
钩子方法可以解决这个问题,放置钩子是隔离变化的一种常见手段。
/* 添加钩子方法 */beverage.prototype.customerwantscondiments = function() { return true;};beverage.prototype.init = function() { this.boilwater(); this.brew(); this.pourincup(); if(this.customerwantscondiments()) { this.addcondiments(); }}/* 实现子类 tea*/var tea = function(){};tea.prototype = new beverage();// 重写非公有方法tea.prototype.brew = function() { console.log(用沸水冲泡茶);};tea.prototype.pourincup = function() { console.log(把茶倒进杯子);};tea.prototype.addcondiments = function() { console.log(加牛奶);};tea.prototype.customerwantscondiments = function() { return window.confirm(需要添加调料吗?);};var tea = new tea();tea.init();
javascript没有提供真正的类式继承,继承是通过对象与对象之间的委托来实现的。
三、“好莱坞原则”:别调用我们,我们会调用你
典型使用场景:
(1)模板方法模式:使用该设计模式意味着子类放弃了对自己的控制权,而是改为父类通知子类。作为子类,只负责提供一些设计上的细节。
(2)观察者模式:发布者把消息推送给订阅者。
(3)回调函数:ajax异步请求,把需要执行的操作封装在回调函数里,当数据返回后,这个回调函数才被执行。
希望本文所述对大家学习javascript程序设计有所帮助。