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 相关文章推荐
jquery对象和DOM对象的区别介绍
Aug 09 Javascript
js实现正则匹配中文标点符号的方法
Dec 23 Javascript
Jquery基础之事件操作详解
Jun 14 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
JavaScript字符串对象
Jan 14 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
使用ECharts实现状态区间图
Oct 25 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
解决layui数据表格table的横向滚动条显示问题
Sep 04 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
vue下的@change事件的实现
Oct 25 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
vue中轮训器的使用
2019/01/27 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
Python中的迭代器漫谈
2015/02/03 Python
python实现按行切分文本文件的方法
2016/04/18 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
战略合作意向书
2014/07/29 职场文书
长城导游词
2015/01/30 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
2015年公司工作总结
2015/04/25 职场文书
事业单位岗位说明书
2015/10/08 职场文书
八年级语文教学反思
2016/03/03 职场文书