* 可拆分的责任链节点

// 可拆分的责任链节点
// Chain.prototype.setNextSuccessor 指定在链条中的下一个节点
// Chain.prototype.passRequest 传递请求给某个节点 function Chain(fn) {
this.fn = fn;
this.successor = null;
} Chain.prototype.setNextSuccessor = function(successor) {
return this.successor = successor;
} Chain.prototype.passRequest = function() {
var ret = this.fn.apply(this, arguments);
if (ret === "nextSuccessor") {
return this.successor
&& this.successor.passRequest.apply(this.successor, arguments);
}
return ret;
} // 3个订单函数
// @orderType:
// 1=>500元定金
// 2=>200元定金
// 3=>普通购买用户
// @pay: 用户是否已经支付定金 (下定金未支付?)
// @stock: SKU 库存数量
var order500 = function(orderType, pay, stock) {
if (orderType === 1 && pay===true) {
console.log("500元定金订购,得到100元优惠券。");
} else {
// 把请求往后面传递
return "nextSuccessor";
}
}
var order200 = function(orderType, pay, stock) {
if (orderType === 2 && pay===true) {
console.log("200元定金订购,得到50元优惠券。");
} else {
return "nextSuccessor";
}
}
var orderNormal = function(orderType, pay, stock) {
if (stock > 0) {
console.log("普通购买, 无优惠券。");
} else {
console.log("手机库存不足。");
}
} // 把3个订单函数分别包装成责任链的节点
var chainOrder500 = new Chain(order500);
var chainOrder200 = new Chain(order200);
var chainOrderNormal = new Chain(orderNormal); // 指定节点在责任链中的顺序
chainOrder500.setNextSuccessor(chainOrder200);
chainOrder200.setNextSuccessor(chainOrderNormal); // test: 把请求传递给第1个节点
chainOrder500.passRequest(1, true, 300);
chainOrder500.passRequest(2, true, 299);
chainOrder500.passRequest(3, true, 298);
chainOrder500.passRequest(1, false, 0); // 后期新增优惠规则 300元定金订购
var order300 = function(orderType, pay, stock) {
if (orderType === 4 && pay===true) {
console.log("300元定金订购,得到60元优惠券。");
} else {
return "nextSuccessor";
}
}
var chainOrder300 = new Chain(order300);
chainOrder500.setNextSuccessor(chainOrder300);
chainOrder300.setNextSuccessor(chainOrder200); chainOrder500.passRequest(4, true, 297);

  output:

500元定金订购,得到100元优惠券。
200元定金订购,得到50元优惠券。
普通购买, 无优惠券。
手机库存不足。
300元定金订购,得到60元优惠券。

* 异步的责任链

function Chain(fn) {
this.fn = fn;
this.successor = null;
} Chain.prototype.setNextSuccessor = function(successor) {
return this.successor = successor;
} Chain.prototype.passRequest = function() {
var ret = this.fn.apply(this, arguments);
if (ret === "nextSuccessor") {
return this.successor
&& this.successor.passRequest.apply(this.successor, arguments);
}
return ret;
} Chain.prototype.next = function() {
return this.successor &&
this.successor.passRequest.apply(this.successor, arguments);
} var fn1 = new Chain(function() {
console.log(1);
return 'nextSuccessor';
}); var fn2 = new Chain(function() {
console.log(2);
var self = this;
setTimeout(function() {
self.next();
}, 1000);
// return 'nextSuccessor';
}); var fn3 = new Chain(function() {
console.log(3);
}); fn1.setNextSuccessor(fn2).setNextSuccessor(fn3);
fn1.passRequest();

  Run:

* 使用aop实现责任链

// 3个订单函数
// @orderType:
// 1=>500元定金
// 2=>200元定金
// 3=>普通购买用户
// @pay: 用户是否已经支付定金 (下定金未支付?)
// @stock: SKU 库存数量
var order500 = function(orderType, pay, stock) {
if (orderType === 1 && pay===true) {
console.log("500元定金订购,得到100元优惠券。");
} else {
// 把请求往后面传递
return "nextSuccessor";
}
}
var order200 = function(orderType, pay, stock) {
if (orderType === 2 && pay===true) {
console.log("200元定金订购,得到50元优惠券。");
} else {
return "nextSuccessor";
}
}
var orderNormal = function(orderType, pay, stock) {
if (stock > 0) {
console.log("普通购买, 无优惠券。");
} else {
console.log("手机库存不足。");
}
} // 使用aop实现责任链
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, 500);
order(2, true, 500);
order(1, false, 500);

  

Run:

javascript 责任链模式 Chain of Responsibility的更多相关文章

  1. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  2. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  3. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  4. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  5. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  6. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  7. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  8. 责任链模式-Chain of Responsibility

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

  9. 设计模式之二十:责任链模式(Chain of Responsibility)

    感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...

随机推荐

  1. BZOJ 4826 影魔

    本题可以采用主席树的在线做法,只不过常数会 \(super\) 大. 和其他题解差不多,我们先要求出第 \(i\) 个数的 \(l_i\) 和 \(r_i\) ,其中 \(l_i\) 表示左边第一个比 ...

  2. Centos7上yum安装mongodb(安装epel中的版本可能会比较老)

    yum install epel-release 搜索mongodb-server 安装mongodb yum install mongodb-server.x86_64 配置mongodb vim ...

  3. npm压缩js文件

    参考:https://blog.csdn.net/msy_msy/article/details/78261383 1.压缩单个js文件 cnpm install uglify-js -g 安装 1& ...

  4. 1 TortoiseGit简介

    tortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.该软件功能和git一样 不同的是:git是命令行操作模式,tortoiseGit界面化操作模式,不 ...

  5. LeetCoded第242题题解--java--数组

    数组 数组的优点在于: 构建非常简单 能在 O(1) 的时间里根据数组的下标(index)查询某个元素(连续内存+对象指向数组下标0位置+index能够直接找到元素) 而数组的缺点在于: 构建时必须分 ...

  6. 客户机与服务器TCP连接状态

    客户机:

  7. 编辑器扩展 --- 自动化处理之AssetPostprocessor资源导入

    AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等.AssetPostprocess ...

  8. 真实机中安装CentOS

    前言 最近在b站上看了兄弟连老师的Linux教程,非常适合入门:https://www.bilibili.com/video/BV1mW411i7Qf 看完后就自己来试着玩下,正好手上有台空闲的电脑就 ...

  9. Promise.all()

    语法:Promise.all(iterable); 参数:iterable 一个可迭代对象,如 Array 或 String. 返回值:如果传入的参数是一个空的可迭代对象,则返回一个已完成(alrea ...

  10. promise的信任问题&控制反转

    //信任问题 //第三方的某个库 function method(cb){ setTimeout(function(){ cb && cb(); //这个库的bug:函数被多调用了一次 ...