* 可拆分的责任链节点

// 可拆分的责任链节点
// 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. NOIP 模拟 $15\; \text{影子}$

    题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...

  2. Longhorn,企业级云原生容器分布式存储 - 高可用

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...

  3. Future有返回值的线程

    //创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(100); //创建多个有返回值的任务 List<Future> ...

  4. redis数据同步之redis-shake

    redis-shake简介 redis-shake是阿里开源的用于redis数据同步的工具,基本功能有: 恢复restore:将RDB文件恢复到目的redis数据库. 备份dump:将源redis的全 ...

  5. 使用VSCode创建第一个VUE项目

    vue init webpack vue_test回车,然后输入工程名称vue_test vue:Missing space before value for key 'components' 原因是 ...

  6. Html 之自动高度 auto 和 100%高度

    HTML 高度 下面示例 设置为 Auto 和 100% <!DOCTYPE html> <html lang="en"> <head> < ...

  7. PipedInputStream and PipedOutputStream example

    必须要有PipedInputStream ,PipedOutputStream 在不同线程,不然死锁 Java.io.PipedOutputStream and java.io.PipedInputS ...

  8. 使用filter过滤GZIP压缩(二)

    在代码之前,讲一下用filter实现GZIP压缩的原理: 因为GZIP压缩之后,是从服务器端传输到浏览器端,从servlet到浏览器(从jsp到浏览器),其实是response带回内容,所以我们要在f ...

  9. Oracle数据库 —— DDL

    时间:2016-10-5 14:55 逆风的方向更适合飞翔我不怕千万人阻挡只怕自己投降 --------------------------------------- 一.表的创建与管理1.表的基本操 ...

  10. 工作效率:通过pycharm的模板代码减少重复工作

    摘要 在常见的业务开发场景下,经常要开发大量重复的代码,这里代码耗时但又必要,就像我们写分析报告一样,每次都要为固定的格式耗费精力.我们可以更加日常开发经验总结出一些常用的模板代码来帮助我们实现一秒五 ...