学习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 相关文章推荐
js常用函数 不错
Sep 08 Javascript
javascript 的Document属性和方法集合
Jan 25 Javascript
JS 树形递归实例代码
May 18 Javascript
Extjs4 GridPanel 的几种样式使用介绍
Apr 18 Javascript
jquery控制select的text/value值为选中状态
Jun 03 Javascript
jQuery中get()方法用法实例
Dec 27 Javascript
jQuery实现的五子棋游戏实例
Jun 13 Javascript
Validform表单验证总结篇
Oct 31 Javascript
浅析Angular19 自定义表单控件
Jan 31 Javascript
layui结合form,table的全选、反选v1.0示例讲解
Aug 15 Javascript
手把手15分钟搭一个企业级脚手架
Sep 16 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
PHP新手上路(九)
2006/10/09 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
详解Python中用于计算指数的exp()方法
2015/05/14 Python
解决PyCharm中光标变粗的问题
2017/08/05 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
python实现自动清理重复文件
2020/08/24 Python
详解Python模块化编程与装饰器
2021/01/16 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
干部培训自我鉴定
2014/01/22 职场文书
大学生英语演讲稿
2014/04/24 职场文书
倡导文明标语
2014/06/16 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
校园安全广播稿范文
2014/09/25 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
服务器nginx权限被拒绝解决案例
2022/09/23 Servers