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实现的一个include函数
Jul 21 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
jquery文档操作wrap()方法实例简述
Jan 10 Javascript
js判断图片加载完成后获取图片实际宽高的方法
Feb 25 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
Jun 09 Javascript
jQuery内容筛选选择器实例代码
Feb 06 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
移动端效果之IndexList详解
Oct 20 Javascript
vue.js前后端数据交互之提交数据操作详解
Apr 24 Javascript
微信运维交互机器人的示例代码
Nov 12 Javascript
微信小程序如何加载数据库真实数据的实现
Mar 04 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中4种常用的抓取网络数据方法
2015/06/04 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
python复制文件的方法实例详解
2015/05/22 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
python asyncio 协程库的使用
2021/01/21 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
红领巾心向党广播稿
2014/01/19 职场文书
大学生水果店创业计划书
2014/01/28 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
单位证明范文
2015/06/18 职场文书
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫
Python序列化模块JSON与Pickle
2022/06/05 Python