* 可拆分的责任链节点
// 可拆分的责任链节点 // 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: