职责链模式

127 阅读1分钟

// 职责链模式 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… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。