// 职责链模式 let ordre500 = function(orderType, pay, stock) { if (orderType === 1 && pay === true) { console.log("500元定金预购,得到100元优惠券"); } else { return "nextSuccessor"; } }; let ordre200 = function(orderType, pay, stock) { if (orderType === 2 && pay === true) { console.log("200元定金预购,得到50元优惠券"); } else { return "nextSuccessor"; } }; let ordreNormal = function(orderType, pay, stock) { if (stock > 0) { console.log("普通用户无优惠券"); } else { console.log("手机库存不足"); } };
let Chain = function(fn) {
this.fn = fn;
this.successor = null;
};
Chain.prototype.setNextSuccessor = function(successor) {
// 指定在链条中的下一个节点
this.successor = successor;
};
Chain.prototype.passRequest = function() {
// 传递请求给某个节点
let ret = this.fn.apply(this, arguments);
if (ret === "nextSuccessor") {
return this.successor && this.successor.passRequest.apply(this.successor, arguments)
}
return ret;
};
let chainOrder500 = new Chain(ordre500);
let chainOrder200 = new Chain(ordre200);
let chainOrderNormal = new Chain(ordreNormal);
chainOrder500.setNextSuccessor(chainOrder200);
chainOrder200.setNextSuccessor(chainOrderNormal);
chainOrder500.passRequest(1, true, 500); // 500元定金预购,得到100元优惠券
chainOrder500.passRequest(2, true, 500); // 200元定金预购,得到50元优惠券
chainOrder500.passRequest(3, true, 500); // 普通用户无优惠券
chainOrder500.passRequest(1, false, 0); // 手机库存不足
// 假如某一天需求要求支持 300 元定金购买,那我们只需要在该链中增加一个节点即可
// let order300 = function(){};
// let chainOrder300 = new Chain(order300)
// chainOrder500.setNextSuccessor(chainOrder300)
// chainOrder300.setNextSuccessor(chainOrder200)
作者:Y__ 链接:juejin.cn/post/684490… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。