学习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设置首页和收藏页面的小例子
Nov 11 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
Mar 13 Javascript
原生js配合cookie制作保存路径的拖拽
Dec 29 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
Feb 25 Javascript
通过AngularJS实现图片上传及缩略图展示示例
Jan 03 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 jQuery
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
Nov 30 Javascript
利用babel将es6语法转es5的简单示例
Dec 01 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
Jun 01 Javascript
高性能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
农民和部队如何穿矿
2020/03/04 星际争霸
3
2006/10/09 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
Python实现的快速排序算法详解
2017/08/01 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
python3实现随机数
2018/06/25 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
小学生红领巾广播稿
2014/01/21 职场文书
租房协议书
2014/09/12 职场文书
走群众路线剖析材料
2014/10/09 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书