责任链模式(面试版)
一、面试常考点
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: 每个节点打日志、链路可视化、统一错误码与超时策略。