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 相关文章推荐
学习YUI.Ext 第三天
Mar 10 Javascript
淘宝搜索框效果实现分析
Mar 05 Javascript
jQuery插件开发全解析
Oct 10 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
javascript Slip.js实现整屏滑动的手机网页
Nov 25 Javascript
如何利用JSHint减少JavaScript的错误
Aug 23 Javascript
解决Mac安装thrift因bison报错的问题
May 17 Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
Sep 26 Javascript
浅谈vuex的基本用法和mapaction传值问题
Nov 08 Javascript
解决Element中el-date-picker组件不回填的情况
Nov 07 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的开合式多级菜单程序
2006/10/09 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
中止javascript执行的方法
2014/02/14 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
Python Tkinter实现简易计算器功能
2018/01/30 Python
Python输出各行命令详解
2018/02/01 Python
python开启debug模式的方法
2019/06/27 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
如何真正的了解python装饰器
2020/08/14 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
介绍一下gcc特性
2015/10/31 面试题
护士个人简历自荐信
2013/10/18 职场文书
业务总经理岗位职责
2014/02/03 职场文书
一年级评语大全
2014/04/23 职场文书
医学求职信
2014/05/28 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
大学校园招聘会感想
2015/08/10 职场文书
学会感恩主题班会
2015/08/12 职场文书
反邪教学习心得体会
2016/01/15 职场文书