返回首页

责任链模式(面试版)

一、面试常考点

1. 责任链模式解决什么问题

将请求沿处理链传递,直到某个节点处理,解耦“请求发起者”和“处理者”。

2. 典型识别信号

存在多级审批/多阶段校验/多重兜底处理。

3. 常见追问

链路中断条件、顺序是否可配置。

二、细节介绍

1. 核心思想

每个节点只处理自己职责,不关心调用方和其他节点实现。

2. 优点

可插拔、可重排、可扩展。

3. 代价

链过长时排查和性能需要监控。

三、示例代码

class Handler {
  setNext(next) {
    this.next = next
    return next
  }

  handle(ctx) {
    if (this.next) return this.next.handle(ctx)
    return ctx
  }
}

class AuthHandler extends Handler {
  handle(ctx) {
    if (!ctx.token) throw new Error('Unauthorized')
    return super.handle(ctx)
  }
}

class ValidateHandler extends Handler {
  handle(ctx) {
    if (!ctx.payload) throw new Error('Bad Request')
    return super.handle(ctx)
  }
}

class BizHandler extends Handler {
  handle(ctx) {
    return { ok: true, data: ctx.payload }
  }
}

const auth = new AuthHandler()
const validate = new ValidateHandler()
auth.setNext(validate).setNext(new BizHandler())

console.log(auth.handle({ token: 't', payload: { id: 1 } }))

四、常用应用场景

1. 请求中间件链

如鉴权、限流、参数校验、业务处理。

2. 审批流系统

多级审批节点按规则流转。

3. 异常兜底链

主流程失败后按降级链逐级处理。

五、高频追问标准答法(Q/A)

1. Q: 责任链和策略的区别

A: 策略是“选一种算法”;责任链是“按顺序让多个节点尝试处理”。

2. Q: 如何避免责任链黑盒化

A: 每个节点打日志、链路可视化、统一错误码与超时策略。