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 相关文章推荐
[JS]点出统计器
Oct 11 Javascript
ExtJS 入门
Oct 29 Javascript
页面调用单个swf文件,嵌套出多个方法。
Nov 21 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
Aug 05 Javascript
js+css3实现旋转效果
Jan 20 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
小程序登录/注册页面设计的实现代码
May 24 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
Aug 09 Javascript
layer更改皮肤的实现方法
Sep 11 Javascript
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
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 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
拖拉表格的JS函数
2008/11/20 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
js 动态选中下拉框
2009/11/26 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
Python解惑之整数比较详解
2017/04/24 Python
Django与JS交互的示例代码
2017/08/23 Python
Python关于反射的实例代码分享
2020/02/20 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
用python实现学生管理系统
2020/07/24 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
《在山的那边》教学反思
2014/02/23 职场文书
三八节标语
2014/06/27 职场文书
80后婚前协议书范本
2014/10/24 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
村官2015年度工作总结
2015/10/14 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
快速学习Oracle触发器和游标
2021/06/30 Oracle
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js
Python Pandas 删除列操作
2022/03/16 Python