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 相关文章推荐
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
jQuery contains过滤器实现精确匹配使用方法
Apr 12 Javascript
无限树Jquery插件zTree的常用功能特性总结
Sep 11 Javascript
jquery 构造函数在表单提交过程中修改数据
May 25 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 Javascript
Vue.js 表单校验插件
Aug 14 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
JS实现根据数组对象的某一属性排序操作示例
Jan 14 Javascript
js实现九宫格布局效果
May 28 Javascript
如何在Vue.JS中使用图标组件
Aug 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
1.PHP简介
2006/10/09 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
写的htc的数据表格
2007/01/20 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
Python导入txt数据到mysql的方法
2015/04/08 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
日本航空官方网站:JAL
2019/06/19 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
财务出纳岗位职责
2014/02/03 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
运动员口号
2014/06/09 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
给老师的一封感谢信
2015/01/20 职场文书
工作检讨书大全
2015/01/26 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL