学习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 Event学习第六章 事件的访问
Feb 07 Javascript
Node.js中使用计时器定时执行函数详解
Aug 15 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
JavaScript的jQuery库中ready方法的学习教程
Aug 14 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
Dec 05 Javascript
JavaScript学习笔记--常用的互动方法
Dec 07 Javascript
node.js中fs.stat与fs.fstat的区别详解
Jun 01 Javascript
vue + vuex todolist的实现示例代码
Mar 09 Javascript
详解vuex状态管理模式
Nov 01 Javascript
Vue传参一箩筐(页面、组件)
Apr 04 Javascript
JavaScript 作用域实例分析
Oct 02 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 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中用正则表达式清除字符串的空白
2011/01/17 PHP
php实现的短网址算法分享
2014/06/20 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
python批量同步web服务器代码核心程序
2014/09/01 Python
python实现解数独程序代码
2017/04/12 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
python安装scipy的方法步骤
2019/06/26 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
Python日志器使用方法及原理解析
2020/09/27 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
python SOCKET编程基础入门
2021/02/27 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
html5简介及新增功能介绍
2020/05/18 HTML / CSS
读书活动总结范文
2014/04/26 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
python实现简易名片管理系统
2021/04/11 Python
修改并编译golang源码的操作步骤
2021/07/25 Golang
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS