学习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静态的url如何传递
May 03 Javascript
ASP中Sub和Function的区别说明
Aug 30 Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 Javascript
jQuery数据缓存用法分析
Feb 20 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
Aug 15 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
json数据传到前台并解析展示成列表的方法
Aug 06 Javascript
JS中使用new Option()实现时间联动效果
Dec 10 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 Javascript
javascript实现简单页面倒计时
Mar 02 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
PHP生成静态页面详解
2006/12/05 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
python从入门到精通(DAY 1)
2015/12/20 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
用python绘制樱花树
2020/10/09 Python
Python hashlib模块的使用示例
2020/10/09 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
大学生自我评价范文分享
2014/02/21 职场文书
开平碉楼导游词
2015/02/06 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
公司门卫岗位职责
2015/04/13 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python