学习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中匿名函数,函数直接量和闭包
May 08 Javascript
前台js调用后台方法示例
Dec 02 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
jQuery中:radio选择器用法实例
Jan 03 Javascript
jQuery中add()方法用法实例
Jan 08 Javascript
纯JavaScript实现的分页插件实例
Jul 14 Javascript
全系IE支持Bootstrap的解决方法
Oct 19 Javascript
jQuery计算文本框字数及限制文本框字数的方法
Mar 01 Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
高性能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
php5.3 注意事项说明
2013/07/01 PHP
如何在php中正确的使用json
2013/08/06 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
javascript 单选框,多选框美化代码
2008/08/01 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
理解JavaScript原型链
2016/10/25 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python nmap实现端口扫描器教程
2020/05/28 Python
Python Map 函数的使用
2020/08/28 Python
python如何调用百度识图api
2020/09/29 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
毕业自荐书
2013/12/09 职场文书
母亲节感恩寄语
2014/02/21 职场文书
大学生个人总结范文
2015/02/15 职场文书
就业导师推荐信范文
2015/03/27 职场文书
暂停营业通知
2015/04/25 职场文书
交通安全月活动总结
2015/05/08 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server