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

  1. // 请假审批,需要组长审批、经理审批、总监审批
  2. class Action {
  3. constructor(name) {
  4. this.name = name
  5. this.nextAction = null
  6. }
  7. setNextAction(action) {
  8. this.nextAction = action
  9. }
  10. handle() {
  11. console.log( `${this.name} 审批`)
  12. if (this.nextAction != null) {
  13. this.nextAction.handle()
  14. }
  15. }
  16. }
  17. let a1 = new Action("组长")
  18. let a2 = new Action("经理")
  19. let a3 = new Action("总监")
  20. a1.setNextAction(a2)
  21. a2.setNextAction(a3)
  22. a1.handle()

场景例子

  • JS 中的事件冒泡
  • 作用域链
  • 原型链

    优点

  • 降低耦合度。它将请求的发送者和接收者解耦。

  • 简化了对象。使得对象不需要知道链的结构
  • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
  • 增加新的请求处理类很方便。

    缺点

  • 不能保证某个请求一定会被链中的节点处理,这种情况可以在链尾增加一个保底的接受者节点来处理这种即将离开链尾的请求。

  • 使程序中多了很多节点对象,可能再一次请求的过程中,大部分的节点并没有起到实质性的作用。他们的作用仅仅是让请求传递下去,从性能当面考虑,要避免过长的职责链到来的性能损耗。