学习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 相关文章推荐
jquery自定义属性(类型/属性值)
May 21 Javascript
javascript中的变量作用域以及变量提升详细介绍
Oct 24 Javascript
node.js中的Socket.IO使用实例
Nov 04 Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 Javascript
js实现超酷的照片墙展示效果图附源码下载
Oct 08 Javascript
JS实现在状态栏显示打字效果完整实例
Nov 02 Javascript
js仿百度切换皮肤功能(html+css)
Jul 10 Javascript
js实现加载更多功能实例
Oct 27 Javascript
node.js实现微信JS-API封装接口的示例代码
Sep 06 Javascript
Windows下Node.js安装及环境配置方法
Sep 18 Javascript
Three.js实现浏览器变动时进行自适应的方法
Sep 26 Javascript
JavaScript设计模式之单例模式简单实例教程
Jul 02 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
如何过滤高亮显示非法字符
2006/10/09 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
js读取cookie方法总结
2014/10/31 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
python杀死一个线程的方法
2015/09/06 Python
Python数组定义方法
2016/04/13 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
大学生村官典型材料
2014/01/12 职场文书
大学生党员自我批评
2014/02/14 职场文书
实习护士自荐信
2014/06/21 职场文书
超市理货员岗位职责
2014/07/04 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
实习护士自荐信
2015/03/25 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs