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 相关文章推荐
ExtJS 简介 让你知道extjs是什么
Dec 29 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
Feb 05 Javascript
jQuery操作input值的各种方法总结
Nov 21 Javascript
javascript中typeof的使用示例
Dec 19 Javascript
BootStrap创建响应式导航条实例代码
May 31 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
Sep 14 Javascript
JS命令模式例子之菜单程序
Oct 10 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
Apr 25 Javascript
深入理解vue-router之keep-alive
Aug 31 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
Aug 08 Javascript
vue实现的封装全局filter并统一管理操作示例
Feb 02 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
深入浅析python继承问题
2016/05/29 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
MYSQL基础面试题
2012/05/13 面试题
最新党员的自我评价分享
2013/11/04 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
社会学专业求职信
2014/07/17 职场文书
高中生逃课检讨书
2014/10/10 职场文书
求职自荐信怎么写
2015/03/04 职场文书
新郎接新娘保证书
2015/05/08 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
诚实守信主题班会
2015/08/13 职场文书
2016年元旦寄语
2015/08/17 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang