JavaScript-职责链模式

职责链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

function order500(orderType, pay, stock) {
  if (orderType === 1 && pay === true) {
    console.log("500元定金,得到100元优惠券");
  } else {
    return "nextSuccessor";
  }
}

function order200(orderType, pay, stock) {
  if (orderType === 2 && pay === true) {
    console.log("200元定金,得到50元优惠券");
  } else {
    return "nextSuccessor";
  }
}

function orderNormal(orderType, pay, stock) {
  if (orderType === 3) {
    if (stock > 0) {
      console.log("普通购买,无优惠券");
    }
  } else {
    console.log("手机库存不足");
  }
}

// 同步职责链
// fn-存储每一步函数
// successor-该节点处理不了,传递给下个节点处理
// fn- 返回一定约定好的值如:nextSuccessor表示传递给下个节点
class Chain {
  constructor(fn) {
    this.fn = fn;
    this.successor = null;
  }

  setSuccessor(successor) {
    return (this.successor = successor);
  }

  passRequest() {
    const ret = this.fn.apply(this, arguments);
    if (ret === "nextSuccessor") {
      return this.successor?.passRequest.apply(this.successor, arguments);
    }
    return ret;
  }

  // 手动调用下个节点
  next() {
    return this.successor?.passRequest.apply(this.successor, arguments);
  }
}

const chainOrder500 = new Chain(order500);
const chainOrder200 = new Chain(order200);
const chainOrderNormal = new Chain(orderNormal);
chainOrder500.setSuccessor(chainOrder200);
chainOrder200.setSuccessor(chainOrderNormal);

chainOrder500.passRequest(1, true, 500);
chainOrder500.passRequest(2, true, 500);
chainOrder500.passRequest(3, true, 500);
chainOrder500.passRequest(1, false, 0);

// 异步职责链
// fn2中通过fn2.next手动传递给下一个节点函数
// const fn1 = new Chain(function () {
//   console.log(1);
//   return "nextSuccessor";
// });

// const fn2 = new Chain(function () {
//   console.log(2);
//   setTimeout(() => {
//     fn2.next();
//   }, 1000);
// });

// const fn3 = new Chain(function () {
//   console.log(3);
// });

// fn1.setSuccessor(fn2).setSuccessor(fn3);
// fn1.passRequest();

/**
 * AOP方式实现职责链,JavaScript的函数一等公民的特性
 */

// Function.prototype.after = function (fn) {
//   const self = this;
//   return function () {
//     const ret = self.apply(this, arguments);
//     if (ret == "nextSuccessor") {
//       return fn.apply(this, arguments);
//     }
//     return ret;
//   };
// };

// const order = order500.after(order200).after(orderNormal);
// order(1, true, 500);
// order(2, true, 500);
// order(3, false, 500);

在这里插入代码片

你可能感兴趣的:(JavaScript设计模式,javascript,前端,开发语言)