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 相关文章推荐
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
Aug 09 Javascript
Jquery读取URL参数小例子
Aug 30 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
Feb 12 Javascript
jQuery中的通配符选择器使用总结
May 30 Javascript
jQuery实现可拖拽3D万花筒旋转特效
Jan 03 Javascript
详解JS中的attribute属性
Apr 25 Javascript
解决百度Echarts图表坐标轴越界的方法
Oct 17 Javascript
微信小程序实现图片选择并预览功能
Jul 25 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
Sep 25 Javascript
python虚拟环境 virtualenv的简单使用
Jan 21 Javascript
JS前后端实现身份证号验证代码解析
Jul 23 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
初级的用php写的采集程序
2007/03/16 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
javascript中"/"运算符常见错误
2010/10/13 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
简单实现python爬虫功能
2015/12/31 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
python逆向入门教程
2018/01/15 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python频繁写入文件时提速的方法
2019/06/26 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
python switch 实现多分支选择功能
2020/12/21 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
军训鉴定表自我鉴定
2014/02/13 职场文书
先进事迹材料范文
2014/12/29 职场文书
2015年安全月活动总结
2015/03/26 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书