设计模式,职责链模式

82 阅读1分钟

读 曾探 前辈的【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);