Skip to content

什么是责任链模式?一般用在什么场景? ​

  • 标签:设计模式

🏛 业务架构师 ​

责任链模式把一组处理步骤串成链条,请求沿链传递,每个节点决定处理、放行或中断。业务价值一句话:流程的编排与节点实现解耦。

我按真实场景讲它的三重价值:

  • 风控/合规前置检查:请求进来依次过"黑名单 → 设备指纹 → 频次限制 → 金额阈值",任何一环拒绝即短路返回。规则顺序调整、临时下线某规则,只改配置不改代码——双十一前风控加规则,不再需要发版,这在营销节奏紧的业务里就是速度;
  • 网关过滤器链:鉴权、限流、日志、灰度标记、脱敏,每层独立开发部署职责,新横切能力插一段即可;
  • 审批流:组长 → 经理 → 财务,链路由配置驱动,组织架构调整不用改代码。

架构上的取舍也要讲透:链条节点间的隐式依赖是隐患——顺序错了结果就错,所以我会配套两件事:一是链路构建集中化配置(可视化最好),二是每个节点显式声明前置条件;另外链太长会拉高延迟,核心交易链路的节点数量要有预算,纯技术检查类节点可以合并。

判断适用信号:业务流程呈现"多步骤、顺序可调、步骤会增减"的特征,责任链就是对的抽象;步骤固定不变的三两步,直接顺序调用更清晰。为变化建抽象,不为想象中的变化建抽象。

🏗 系统架构师 ​

责任链模式把多个处理节点串成链,请求沿链传递,每个节点决定处理、放行或中断。核心价值:节点无序耦合、流程可配置化扩展。

结构:Handler 抽象类持 next 引用,子类实现 handle 并决定是否继续传递。

我经历过的落地:

  • 网关/过滤器体系:Netty ChannelPipeline、Spring MVC Interceptor、Servlet Filter、Gateway GlobalFilter,鉴权→限流→审计→路由就是天然链;
  • 风控引擎:实名校验→黑名单→频控→模型评分,规则按序执行,新规则插入链条即可,规则上下架靠配置开关;
  • 审批流:组长→经理→总监逐级审批,节点含通过/驳回逻辑。

与策略的区别:策略是"选一个执行",责任链是"依次过多个",两者常组合——链上每个节点内部再走策略。

工程要点:链要可观测(每个节点耗时打点),否则排查性能退化很痛苦;用 Spring 实现时让节点实现 Ordered 接口,顺序由容器统一管理,禁止硬编码 next 引用。

💻 全栈开发专家 ​

多个处理器串成链,请求沿链传递,每个节点决定处理/放行/中断。核心是"发送者不需要知道谁最终处理", 动态增删处理节点。

java
public abstract class Handler {
    private Handler next;
    public Handler next(Handler next) { this.next = next; return next; }
    public boolean handle(Request req) {
        if (!doHandle(req)) return false;      // 中断
        return next == null || next.handle(req);
    }
    protected abstract boolean doHandle(Request req);
}
// 装配
new AuthHandler().next(new RiskHandler()).next(new BizHandler());

框架里的实际应用(面试用这些举例最有说服力):

  • Netty 的 ChannelPipeline,编解码器一层层过;
  • Spring MVC 的 HandlerInterceptor.preHandle 链;
  • MyBatis 插件(InterceptorChain 对 Executor 层层代理);
  • Servlet Filter、Gateway 的 GlobalFilter。

我落地的场景:风控准入链(黑名单→设备指纹→频控→额度)和订单改价校验链。工程要点:链的顺序要可视化/可配置(@Order 或配置中心),节点保持无状态以便复用,链路加 trace 日志(第几个节点拒绝),排查时一眼定位。