学习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 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
AJAX分页的代码(后台asp.net)
Feb 14 Javascript
禁用页面部分JavaScript不是全部而是部分
Sep 03 Javascript
javascript事件冒泡实例分析
May 13 Javascript
jQuery实现简单的图片查看器
Sep 11 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
JavaScript 冒泡排序和选择排序的实现代码
Sep 03 Javascript
angular2倒计时组件使用详解
Jan 12 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
Node.js npm命令运行node.js脚本的方法
Oct 10 Javascript
vue实现移动端悬浮窗效果
Dec 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
Terran兵种对照表
2020/03/14 星际争霸
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
javascript常用函数(1)
2015/11/04 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
解决vue scoped scss 无效的问题
2020/09/04 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
利用Python查看目录中的文件示例详解
2017/08/28 Python
详解python的ORM中Pony用法
2018/02/09 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
工程总经理工作职责
2013/12/09 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
小学作文评语大全
2014/04/21 职场文书
应届大专生求职信
2014/06/26 职场文书
学校运动会加油词
2015/07/18 职场文书
中学语文教学反思
2016/02/16 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android