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 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
jQuery1.6 使用方法一
Nov 23 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
Feb 13 Javascript
JS文字球状放大效果代码分享
Aug 19 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
Feb 19 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
详解bootstrap导航栏.nav与.navbar区别
Nov 23 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
Vue CLI3基础学习之pages构建多页应用
Jun 02 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 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 HTML代码串截取代码
2008/12/29 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
js实现简单点赞操作
2020/03/17 Javascript
详解vue 组件
2020/06/11 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python标准库os.path包、glob包使用实例
2014/11/25 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python+django实现简单的文件上传
2016/08/17 Python
详解Python import方法引入模块的实例
2017/08/02 Python
python查看模块安装位置的方法
2018/10/16 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Python实现socket非阻塞通讯功能示例
2019/11/06 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
Django日志及中间件模块应用案例
2020/09/10 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
代收款委托书范本
2014/10/01 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
党员带头倡议书
2015/04/29 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python