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方法
Jun 24 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
jQuery实现当前页面标签高亮显示的方法
Mar 10 Javascript
浅谈javascript的分号的使用
May 12 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
Javascript中的迭代、归并方法详解
Jun 14 Javascript
jQuery实现的简单百分比进度条效果示例
Aug 01 Javascript
jquery+css3问卷答题卡翻页动画效果示例
Oct 26 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
Jun 25 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
Aug 14 Javascript
js实现时钟定时器
Mar 26 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
3
2006/10/09 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
Python实现截屏的函数
2015/07/25 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
实例代码讲解Python 线程池
2020/08/24 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
如何客观的进行自我评价
2013/12/17 职场文书
物业工作计划书
2014/01/10 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
公司员工管理制度
2015/08/04 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers