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 相关文章推荐
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
Mar 04 Javascript
Extjs中常用表单介绍与应用
Jun 07 Javascript
IE8中动态创建script标签onload无效的解决方法
Dec 22 Javascript
七夕情人节丘比特射箭小游戏
Aug 20 Javascript
js实现动态加载脚本的方法实例汇总
Nov 02 Javascript
实例解析jQuery工具函数
Dec 01 Javascript
JavaScript设置名字输入不合法的实现方法
May 23 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 Javascript
详解vue.js移动端配置flexible.js及注意事项
Apr 10 Javascript
vue+elementUI实现表格关键字筛选高亮
Oct 26 Javascript
ES6箭头函数和扩展实例分析
May 23 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
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
python通过shutil实现快速文件复制的方法
2015/03/14 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
学生党支部先进事迹
2014/02/04 职场文书
个人近期表现材料
2014/02/11 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
门卫岗位职责
2015/02/09 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js