学习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实现页面滚动图片加载(仿lazyload效果)
Jul 22 Javascript
基于datagrid框架的查询
Apr 08 Javascript
JavaScript利用正则表达式去除日期中的“-”
Jul 01 Javascript
JavaScript中Function详解
Feb 27 Javascript
js实现超简单的展开、折叠目录代码
Aug 28 Javascript
浏览器兼容性问题大汇总
Dec 17 Javascript
AngularJS中$interval的用法详解
Feb 02 Javascript
JavaScript中Array的实用操作技巧分享
Sep 11 Javascript
概述VUE2.0不可忽视的很多变化
Sep 25 Javascript
仿京东快报向上滚动的实例
Dec 13 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
Nov 12 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 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中的函数声明与使用详解
2017/05/27 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
编写Python的web框架中的Model的教程
2015/04/29 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python 实现一个计时器
2020/07/28 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
Java的基础面试题附答案
2016/01/10 面试题
党员思想汇报材料
2014/12/19 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
加班费申请报告
2015/05/15 职场文书
安全生产学习心得体会
2016/01/18 职场文书
学习心理学心得体会
2016/01/22 职场文书
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL