学习JavaScript设计模式之模板方法模式


Posted in Javascript onJanuary 20, 2016

一、定义

模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 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程序设计有所帮助。

Javascript 相关文章推荐
Javascript 键盘事件的组合使用实现代码
May 04 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
判断访客终端类型集锦
Jun 05 Javascript
微信小程序 Page()函数详解
Oct 17 Javascript
详解angular用$sce服务来过滤HTML标签
Apr 11 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
js+SVG实现动态时钟效果
Jul 14 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
Vue.directive使用注意(小结)
Aug 31 Javascript
js回到页面指定位置的三种方式
Dec 17 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
高性能JavaScript循环语句和条件语句
Jan 20 #Javascript
详解Javascript模板引擎mustache.js
Jan 20 #Javascript
JavaScript优化专题之Loading and Execution加载和运行
Jan 20 #Javascript
JQuery日历插件My97DatePicker日期范围限制
Jan 20 #Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 #Javascript
js实现图片无缝滚动特效
Mar 19 #Javascript
学习JavaScript设计模式之迭代器模式
Jan 19 #Javascript
You might like
PHP整合PayPal支付
2015/06/11 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
js parseInt("08")未指定进位制问题
2010/06/19 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
python文件写入实例分析
2015/04/08 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
幼儿园校车司机的岗位职责
2014/01/30 职场文书
青年文明号复核材料
2014/02/11 职场文书
销售目标责任书
2014/07/23 职场文书
高中军训感想
2015/08/07 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript