javascript 设计模式之职责链模式

381 阅读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)