解耦请求发送者和N个接收者之间的复杂关系 职责链中的节点数量和顺序是可以自由变化的,我们可以在运行时决定链中包含哪些节点。 可以在链尾增加一个保底的接受者节点

对象设置successor并执行passRequest方法

  1. class Chain {
  2. construcor(
  3. private fn,
  4. private successor
  5. ) {}
  6. setNextSuccessor(successor) {
  7. return this.successor = successor; // 注意return,可链式调用
  8. }
  9. passRequest() {
  10. var ret = this.fn.apply(this, arguments);
  11. if (ret = 'nextSuccessor') {
  12. return this.next();
  13. }
  14. return ret;
  15. }
  16. next() {
  17. return this.successor && this.successor.apply(this.successor, arguments);
  18. }
  19. }
  20. // 把3个订单函数分别包装成职责链的节点
  21. var chainOrder500 = new Chain(order500);
  22. var chainOrder200 = new Chain(order200);
  23. var chainOrderNormal = new Chain(orderNormal);
  24. // 指定节点在职责链中的顺序
  25. chainOrder500.setNextSuccessor(chainOrder200);
  26. chainOrder200.setNextSuccessor(chainOrderNormal);
  27. // 请求传递给第一个节点
  28. chainOrder500.passRequest(1, true, 500);
  29. // 请求传递给任意节点
  30. chainOrderNormal.passRequest(1, false, 500);
  31. // 可增加order300
  32. // 异步职责链,手动传递请求给职责链的下一个节点
  33. var chainOrder200 = new Chain(function () {
  34. // 执行,返回undefined
  35. setTimeout(() => {
  36. this.next();
  37. }, 300);
  38. });

AOP模式

after函数

  1. Function.prototype.after = function (fn) {
  2. return () => {
  3. var ret = this.apply(this, arguments);
  4. if (ret === 'nextSuccessor') {
  5. return fn.apply(this, arguments);
  6. }
  7. return ret;
  8. }
  9. }
  10. var order = order500.after(order200).after(orderNormal);