JavaScript设计模式之职责链模式应用示例


Posted in Javascript onAugust 07, 2018

本文实例讲述了JavaScript设计模式之职责链模式。分享给大家供大家参考,具体如下:

一、职责链的定义:

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

二、实例场景说明:

某公司对公司产品-手机进行促销活动,有以下政策:在正式购买时,已经支付过500元定金的用户会收到100元的商城优惠卷,交200元定金的用户可以收到50元的优惠卷,而之前没有支付定金的用户只能进入普通购买模式,也就是没有优惠卷,主要危险为在库存有限的情况下不一定能买到手机。

三、实例代码如下:

1、创建3中购买模式的函数对象,如下:

/**
* @param: orderType 表示订单类型
* @param: pay 表示用户是否已经支付定金
* @param: stock 表示当前用户普通购买的手机库存数量,交过定金的用户不受此限制
**/
var order500 = function( orderType, pay, stock ){
  if( orderType === 1 && pay === true)
     console.log('500元定金预购,得到100优惠卷');
  else
     return 'nextSuccessor'; //不知道下一个节点是谁,反正把请求往后面传递
};
var order200 = function( orderType, pay, stock){
  if( orderType === 2 && pay === true)
    console.log( '200元定金预购,得到50元优惠卷' );
  else
    return 'nextSuccessor';
};
var orderNormal = function(orderType, pay, stock){
  if(stock > 0)
    console.log('普通购买,无优惠卷');
  else
    console.log('手机库存不足');
};

2、书写一个把函数包装进职责链节点的构造函数,如下:

var Chain = function(fn){
  this.fn = fn;
  this.successor = null;
};
Chain.prototype.setNextSuccessor = function( successor ){
  return this.successor = successor;
};
Chain.prototype.passRequest = function(){
  var ret = this.fn.apply( this, arguments );
  if( ret === 'nextSuccessor'){
    return this.successor && this.successor.passRequest.apply( this,successor, arguments );
  }
   return ret;
};

3、调用如下:

1> 把3个订单函数分别包装成职责链的节点:

var chainOrder500 = new Chain( order500 );
var chainOrder200 = new Chain( order200 );
var chainOrderNormal = new Chain( orderNormal );

2> 指定节在职责链中的顺序:

chainOrder500.setNextSuccessor( chainOrder200 );
chainOrder200.setNextSuccessor( chainOrderNormal );

3> 把请求传递给第一个节点,如下:

chainOrder500.passRequest( 1, true, 500 ); //输出:500元定金预购,得到100优惠卷
chainOrder500.passRequest( 2, true, 500 ); //输出:200元定金预购,得到50优惠卷
chainOrder500.passRequest( 3, true, 500 ); //输出:普通购买,无优惠卷
chainOrder500.passRequest( 1, false, 0 ); //输出:手机库存不足

四、职责链模式优点:

通过上述代码,我们可以灵活的添加和删除节点,以及可灵活的修改节点的顺序。

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

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

Javascript 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
IE无法设置短域名下Cookie
Sep 23 Javascript
JQuery实现倒计时按钮具体方法
Nov 14 Javascript
js操作输入框提示信息且响应鼠标事件
Mar 25 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
第一章之初识Bootstrap
Apr 25 Javascript
javascript阻止事件冒泡和浏览器的默认行为
Jan 21 Javascript
JS实现移动端整屏滑动的实例代码
Nov 10 Javascript
vue实现商城上货组件简易版
Nov 27 Javascript
JavaScript伪数组用法实例分析
Dec 22 Javascript
Angular(5.2->6.1)升级小结
Dec 27 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 #Javascript
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 #Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 #Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 #Javascript
深入浅析var,let,const的异同点
Aug 07 #Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 #Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 #Javascript
You might like
PHP strtok()函数的优点分析
2010/03/02 PHP
php中Smarty模板初体验
2011/08/08 PHP
PHP Session 变量的使用方法详解与实例代码
2013/09/11 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
关于js datetime的那点事
2011/11/15 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
Javascript继承机制详解
2017/05/30 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
详解vue axios中文文档
2017/09/12 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
Python转码问题的解决方法
2008/10/07 Python
python控制台中实现进度条功能
2015/11/10 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
一岗双责责任书
2014/04/15 职场文书
2015年信访工作总结
2015/04/07 职场文书
导游词之桂林山水
2019/09/20 职场文书