设计模式-职责链模式

2019-10-21 10:51:5210/1/2021, 3:34:43 AM

WHAT

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

普通设计

职责链模式

WHY

  • 职责链模式解耦了请求发送者 A 和 N 个接收者之间的复杂关系,由于不知道链中的哪个节点可以处理你发出的请求,所以你只需要把请求传递给第一个节点即可
  • 使用职责链后,链中的节点可以灵活拆分重组,增加/删除/改动一个节点都轻而易举
  • 可以手动指定起始节点,请求并不是非得从链中的第一个节点开始传递,这样就可以减少请求在链中的传递次数,更快的找到合适的请求接收者

HOW

function a(x) {
  return false;
}
function b() {
  console.log(2);
  return true;
}
function c() {
  console.log(3);
}

// 职责链模式普通实现
class Chain {
  constructor(fn) {
    this.fn = fn;
    this.successor = null;
  }
  setNextSuccessor(successor) {
    return (this.successor = successor);
  }
  passRequest() {
    let ret = this.fn.apply(this, arguments);
    if (ret === false)
      return (
        this.successor &&
        this.successor.passRequest.apply(this.successor, arguments)
      );
    return ret;
  }
}
let aChain = new Chain(a);
let bChain = new Chain(b);
let cChain = new Chain(c);
aChain.setNextSuccessor(bChain);
bChain.setNextSuccessor(cChain);

aChain.passRequest(12); // 2

// AOP实现职责链模式
Function.prototype.after = function(fn) {
  let _self = this;
  return function() {
    let tmp = _self.apply(this, arguments);
    if (tmp === false) return fn && fn.apply(this, arguments);
    return tmp;
  };
};

a.after(b).after(c)(12); // 2