学习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 相关文章推荐
Android中资源文件(非代码部分)的使用概览
Dec 18 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
原生javaScript做得动态表格(注释写的很清楚)
Dec 29 Javascript
js判断输入字符串是否为空、空格、null的方法总结
Jun 14 Javascript
EasyUI中在表单提交之前进行验证
Jul 19 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
Feb 20 Javascript
React入门教程之Hello World以及环境搭建详解
Jul 11 Javascript
微信小程序授权获取用户详细信息openid的实例详解
Sep 20 Javascript
详解Vuex中mapState的具体用法
Sep 28 Javascript
浅析我对JS延迟异步脚本的思考
Oct 12 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php从文件夹随机读取文件的方法
2015/06/01 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
python类参数self使用示例
2014/02/17 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
局域网标准
2016/09/10 面试题
采购内勤岗位职责
2013/12/10 职场文书
企业管理培训感言
2014/01/27 职场文书
目标责任书范文
2014/04/14 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
创文明城市标语
2014/06/16 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
Nginx安装配置详解
2022/06/25 Servers