学习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移动div层-javascript 拖动层
Mar 22 Javascript
javascript数字数组去重复项的实现代码
Dec 30 Javascript
基于OL2实现百度地图ABCD marker的效果
Oct 01 Javascript
手机图片预览插件photoswipe.js使用总结
Aug 25 Javascript
js实现漫天星星效果
Jan 19 Javascript
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
详解Angular系列之变化检测(Change Detection)
Feb 26 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
Jul 03 Javascript
vue 自动化路由实现代码
Sep 03 Javascript
关于AngularJS中几种Providers的区别总结
May 17 Javascript
VUE-ElementUI 自定义Loading图操作
Nov 11 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文件读写操作之文件读取方法详解
2011/01/13 PHP
Javascript之文件操作
2007/03/07 Javascript
摘自百度的图片轮换效果代码
2007/11/19 Javascript
不安全的常用的js写法
2009/09/15 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python简易版图书管理系统
2019/08/12 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
师范毕业生求职自荐信
2013/09/25 职场文书
触摸春天教学反思
2014/02/03 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
普通话宣传标语
2014/06/26 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
怎样写离婚协议书
2014/09/10 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android