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 相关文章推荐
pjblog修改技巧汇总
Mar 12 Javascript
json的前台操作和后台操作实现代码
Jan 20 Javascript
jquery 插件学习(六)
Aug 06 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
Aug 28 Javascript
JavaScript实现信用卡校验方法
Apr 07 Javascript
JQuery中DOM实现事件移除的方法
Jun 13 Javascript
基于jQuery实现动态数字展示效果
Aug 12 Javascript
jQuery插件开发汇总
May 15 Javascript
从零学习node.js之文件操作(三)
Feb 21 Javascript
vue中appear的用法
Aug 17 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
Jul 07 Javascript
vant组件中 dialog的确认按钮的回调事件操作
Nov 04 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 分页原理详解
2009/08/21 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
RequireJS多页面应用实例分析
2016/06/29 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
python对一个数向上取整的实例方法
2020/06/18 Python
thinkphp5 路由分发原理
2021/03/18 PHP
材料加工硕士生求职信
2013/10/10 职场文书
如何做好总经理助理
2013/11/12 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python