学习JavaScript设计模式之责任链模式


Posted in Javascript onJanuary 18, 2016

一、定义

责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

二、示例

  • 假设这么一个场景:
  • 我们负责一个售卖手机的电商网站,经过分别缴纳500元定金和200元定金的两轮预定后,到了正式购买阶段。针对预定用户实行优惠,支付过500元定金的用户会收到100元的商城优惠券,支付过200元定金的用户会收到50元的商城优惠券,没有支付定金的用户归为普通购买,且在库存有限的情况下不一定保证买到。
/* 传统方式实现 */
// orderType:[1:500, 2:200, 3:普通],isPaid:true/false,stock:库存量
var order = function(orderType, isPaid, stock) {
  if(orderType === 1) {
    if(isPaid) {
      console.log("500元定金预购,得到100优惠券");
    } else {
      if(stock > 0) {
        console.log("普通购买,无优惠券");
      }else {
        console.log("库存不足");
      }
    }
  }else if(orderType === 2) {
    if(isPaid) {
      console.log("200元定金预购,得到50优惠券");
    } else {
      if(stock > 0) {
        console.log("普通购买,无优惠券");
      }else {
        console.log("库存不足");
      }
    }
  }else if(orderType === 2) {
    if(stock > 0) {
      console.log("普通购买,无优惠券");
    }else {
      console.log("库存不足");
    }
  }
}

order(1, true, 500);

/*职责链 */
var order500 = function(orderType, isPaid, stock) {
  if(orderType === 1 && isPaid === true) {
    console.log("500元定金预购,得到100优惠券");
  }else {
    return "nextSuccessor";
  }
};

var order200 = function(orderType, isPaid, stock) {
  if(orderType === 2 && isPaid === true) {
    console.log("200元定金预购,得到50优惠券");
  }else {
    return "nextSuccessor";
  }
};

var orderNormal = function(orderType, isPaid, stock) {
  if(stock > 0) {
    console.log("普通购买,无优惠券");
  }else {
    console.log("库存不足");
  }
};

Function.prototype.after = function(fn) {
  var self = this;
  return function() {
    var ret = self.apply(this, arguments);
    if(ret === "nextSuccessor") {
      return fn.apply(this, arguments);
    }
    return ret;
  };
}

var order = order500.after(order200).after(orderNormal);
order(1, true, 10);

优点:解耦了请求发送者和N个接受者之间的复杂关系。
弊端:不能保证某个请求一定会被链中的节点处理。

三、示例:文件上传对象

示例2:用责任链模式获取文件上传对象
PS:对比《学习JavaScript设计模式之迭代器模式》

function getActiveUploadObj() {
  try{
    return new ActiveObject("TXFTNActiveX.FTNUpload"); // IE上传控件
  }catch(e) {
    return "nextSuccessor";
  }
}

function getFlashUploadObj() {
  if(supportFlash().f === 1) {  // supportFlash见《JavaScript设计模式--迭代器模式》
    var str = '<object type="application/x-shockwave-flash"></object>';
    return $(str).appendTo($("body"));
  }
  return "nextSuccessor";
}

function getFormUploadObj() {
  var str = '<input name="file" type="file" class="ui-file" />';
  return $(str).appendTo($("body"));
}

var getUploadObj = getActiveUploadObj.after(getFlashUploadObj).after(getFormUploadObj);

console.log(getUploadObj());

无论是作用域链、原型链、还是DOM节点中的事件冒泡,我们都能从中找到职责链的影子。

以上就是本文的全部内容,希望本文所述对大家学习javascript程序设计有所帮助。。

Javascript 相关文章推荐
javascript中不提供sleep功能如何实现这个功能
May 27 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
JavaScript AOP编程实例
Jun 16 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
jQuery插件实现文件上传功能(支持拖拽)
Aug 27 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
JS 拦截全局ajax请求实例解析
Nov 29 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
Angular 表单控件示例代码
Jun 26 Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 Javascript
使用vue制作滑动标签
Sep 21 Javascript
微信小程序scroll-view不能左右滑动问题的解决方法
Jul 09 Javascript
深入学习jQuery Validate表单验证(二)
Jan 18 #Javascript
深入学习jQuery Validate表单验证
Jan 18 #Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
Jan 18 #Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
Dec 13 #Javascript
理解JavaScript中Promise的使用
Jan 18 #Javascript
你不知道的高性能JAVASCRIPT
Jan 18 #Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 #Javascript
You might like
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
Python实现堆排序的方法详解
2016/05/03 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
python与idea的集成的实现
2020/11/20 Python
复古服装:RetroStage
2019/05/10 全球购物
会计自我鉴定范文
2013/10/06 职场文书
学校门卫管理制度
2014/01/30 职场文书
保护环境建议书
2014/03/12 职场文书
国旗下的演讲稿
2014/05/08 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
个人批评与自我批评
2014/10/15 职场文书