学习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 相关文章推荐
ExtJS 2.0实用简明教程 之Border区域布局
Apr 29 Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
js判断手机和pc端选择不同执行事件的方法
Jan 30 Javascript
javascript动态设置样式style实例分析
May 13 Javascript
angular 用拦截器统一处理http请求和响应的方法
Jun 08 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
jQuery实现轮播图效果
Nov 26 jQuery
vue自定义标签和单页面多路由的实现代码
May 03 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 Javascript
JS实现可以用键盘方向键控制的动画
Dec 11 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实现利用MySQL保存session的方法
2014/08/23 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
canvas绘制七巧板
2017/02/03 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
python 处理string到hex脚本的方法
2018/10/26 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
django的csrf实现过程详解
2019/07/26 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
物业门卫岗位职责
2013/12/28 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
工作年限证明范本
2015/06/15 职场文书
小学生暑假安全公约
2015/07/14 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL