Skip to content

责任链设计模式

一、基础定义

  1. 核心目的:解除请求发送者与多个请求处理器之间的耦合。
  2. 实现方式:所有处理器内部持有下一个处理器的引用,串联形成一条处理链。
  3. 执行逻辑:请求沿着链条依次传递,每个处理器判断自身是否能处理当前请求;可自行处理,也可转交后继处理器,直至链路末尾。
  4. 经典原生实现:Java Web Filter过滤器链,请求依次经过filter1、filter2、filter3,最终抵达控制层目标方法,依靠doFilter()完成链式传递。

二、三大核心角色

1. 抽象处理器 Handler

抽象父类/接口,统一规范:

  • 定义处理请求的抽象方法handler()
  • 提供后继处理器成员变量;
  • 提供setNext()方法,用于绑定下一个处理节点。

2. 具体处理器 Concrete Handler

继承/实现抽象Handler,每个类只负责单一处理逻辑:

  • 实现handler()方法,执行业务处理;
  • 处理完成或自身不具备处理能力时,调用后继处理器的handler()方法,传递请求。 订单案例中的具体处理器:
  • OrderValidation:订单参数校验
  • OrderFill:填充订单基础数据
  • OrderAmountCalculate:订单金额算价
  • OrderCreate:订单落库持久化

3. 客户端 Client

  1. 组装所有处理器,按业务顺序串联构建完整执行链;
  2. 向链头第一个处理器提交请求;
  3. 不感知内部传递、处理细节,仅负责发起请求。

配套实体类 OrderInfo

封装待处理的数据载体,存储订单核心信息:productId、userId、amount等,全链路统一传递。

三、订单创建业务执行流程

完整处理链路顺序:检验参数 → 填充订单数据 → 算价 → 落库

  1. 客户端创建4个处理器实例;
  2. 通过setNext()按流程顺序串联,形成完整责任链;
  3. 客户端传入OrderInfo对象,调用链首校验处理器的handler方法;
  4. 每一步处理器完成自身逻辑后,自动传递给下一个节点;
  5. 全部节点执行完毕,订单完整创建完成。

四、优缺点

优点

  1. 解耦:请求发起方与各处理器完全隔离,互不依赖;
  2. 易扩展:新增处理节点只需新增具体Handler,不修改原有代码,符合开闭原则;
  3. 灵活调度:客户端可自由调整处理器顺序、增删节点;
  4. 职责拆分:每个处理器只做单一功能,单一职责;
  5. 简化对象关联:仅需持有下一个节点引用,无需维护所有处理器关联关系。

缺点

  1. 性能损耗:链路过长时,请求会遍历大量处理器,影响处理效率;
  2. 客户端负担重:链条的组装顺序、节点完整性完全由客户端控制,配置错误会引发异常;
  3. 存在循环风险:若客户端错误设置后继引用,会出现无限循环调用。

五、通用拓展业务场景

所有按固定顺序分步处理、多节点流水线流程均可使用责任链:

  1. 内容多级审核:文本审核 → 图片审核 → 视频审核;
  2. 订单全流程:参数校验、数据填充、金额计算、落库、返佣;
  3. 多级流程审批:组长审批 → 主管审批 → 副总裁审批 → 总裁审批;
  4. Web过滤器、拦截器、接口参数校验链路、日志处理链路。

六、完整总结(面试背诵版)

  1. 责任链属于行为型设计模式,核心是将多个处理器串联成链条,请求沿链条传递,解除调用方与处理节点耦合。
  2. 分为抽象Handler、具体处理器、客户端三大角色,抽象类定义处理接口与后继绑定方法,每个具体处理器只负责单一逻辑。
  3. 优势是职责单一、扩展灵活、解耦;缺点是长链路性能差,链条组装依赖客户端,易出现循环bug。
  4. 典型应用:过滤器、多级审批、订单流水线、内容审核等有序分步处理业务。

七、面试简答

问:介绍责任链模式以及适用场景?

答: 责任链模式把多个处理器通过持有下一级引用串联成一条链路,客户端发起请求后,请求会依次经过每一个处理器,处理器可自行处理或向下传递,实现调用方与处理逻辑解耦。 包含三个角色:抽象处理器定义统一处理方法与后继绑定接口;具体处理器实现各自业务逻辑;客户端负责组装链条并发起请求。 优点是职责拆分清晰、新增节点无需修改旧代码、可灵活调整执行顺序;缺点是链条过长会影响性能,组装错误会出现循环调用。 适用场景:过滤器拦截器、多级审批流程、订单分步创建、多媒体内容多级审核等有序流水线业务。

Powered by VitePress 1.6.4 | 持续更新中