读 曾探 前辈的【JavaScript 设计模式与开发实践】一书,有感
// 此处例子是书中源码
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("手机库存不足");
}
};
var Chain = function (fn) {
this.fn = fn;
this.successor = null;
};
Chain.prototype.setNextSuccessor = function (successor) {
return (this.successor = successor);
};
Chain.prototype.passRequest = function () {
return ret;
};
var ret = this.fn.apply(this, arguments);
if (ret === "nextSuccessor") {
return (
this.successor &&
this.successor.passRequest.apply(this.successor, arguments)
);
}
var chainOrder500 = new Chain(order500);
var chainOrder200 = new Chain(order200);
var chainOrderNormal = new Chain(orderNormal);
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); // 输出:手机库存不足
// 此处为个人想法
// 这种职责链模式也挺有意思的,可以任意改动执行顺序
let mode1 = [order500, order200, orderNormal];
function render(mode, ...args) {
mode.some((fn) => {
if (fn.apply(null, args) !== "nextSuccessor") {
return true;
}
});
}
render(mode1, 1, true, 500);