JavaScript设计模式之模板方法模式原理与用法示例


Posted in Javascript onAugust 07, 2018

本文实例讲述了JavaScript设计模式之模板方法模式原理与用法。分享给大家供大家参考,具体如下:

一、模板方法模式:一种只需使用继承就可以实现的非常简单的模式。

二、模板方法模式由两部分组成,第一部分是抽象父类,第二部分是具体的实现子类。

三、以设计模式中的Coffee or Tea来说明模板方法模式:

1、模板Brverage,代码如下:

var Beverage = function(){};
Beverage.prototype.boilWater = function(){
  console.log('把水煮沸');
};
Beverage.prototype.pourInCup = function(){
  throw new Error( '子类必须重写pourInCup' );
};
Beverage.prototype.addCondiments = function(){
  throw new Error( '子类必须重写addCondiments方法' );
};
Beverage.prototype.customerWantsConditions = function(){
  return true; //默认需要调料
};
Beverage.prototype.init = function(){
  this.boilWater();
  this.brew();
  this.pourInCup();
  if(this.customerWantsCondiments()){
    //如果挂钩返回true,则需要调料
    this.addCondiments();
  }
};

2、子类继承父类

var CoffeeWithHook = function(){};
CoffeeWithHook.prototype = new Beverage();
CoffeeWithHook.prototype.brew = function(){
  console.log('把咖啡倒进杯子');
};
CoffeeWithHook.prototype.addCondiments = function(){
  console.log('加糖和牛奶');
};
CoffeeWithHook.prototype.customerWantsCondiments = function(){
 return window.confirm( '请问需要调料吗?' );
};

3、煮一杯咖啡

var coffeeWithHook = new CoffeeWithHook();
coffeeWithHook.init();

四、另一种写法

var Beverage = function( param ){
  var boilWater = function(){
   console.log( '把水煮沸' );
  };
  var brew = param.brew || function(){
   throw new Error( '必须传递brew方法' );
  };
  var pourInCup = param.pourInCup || function(){
    throw new Error( '必须传递pourInCup方法' );
  };
  var addCondiments = param.addCondiments || function(){
   throw new Error( '必须传递addCondiments方法' );
  };
  var F = function(){};
  F.prototype.init = function(){
   boilWater();
   brew();
   pourInCup();
   addCondiments();
  };
  return F;
};
var Coffee = Beverage({
  brew: function(){
     console.log( '用沸水冲泡咖啡' );
  },
  pourInCup: function(){
    console.log('把咖啡倒进杯子');
  },
  addCondiments: function(){
    console.log('加糖和牛奶');
  }
});
var coffee = new Coffee();
coffee.init();

上述代码使用在线HTML/CSS/JavaScript代码运行工具http://tools.3water.com/code/HtmlJsRun测试运行结果:

JavaScript设计模式之模板方法模式原理与用法示例

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js操作textarea方法集合封装(兼容IE,firefox)
Feb 22 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
Jquery基础教程之DOM操作
Aug 19 Javascript
JavaScript函数中关于valueOf和toString的理解
Jun 14 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
Nov 18 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
Jul 31 Javascript
bootstrap table表格客户端分页实例
Aug 07 Javascript
node+express+ejs使用模版引擎做的一个示例demo
Sep 18 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 jQuery
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
你准备好迎接vue3.0了吗
Apr 28 Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 #Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 #Javascript
深入浅析var,let,const的异同点
Aug 07 #Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 #Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 #Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 #Javascript
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 #Javascript
You might like
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php生成xml时添加CDATA标签的方法
2014/10/17 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
详解Python中用于计算指数的exp()方法
2015/05/14 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
python 图像平移和旋转的实例
2019/01/10 Python
python递归法解决棋盘分割问题
2019/07/17 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
平面设计岗位职责
2013/12/14 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang