主题切换
责任链设计模式
一、基础定义
- 核心目的:解除请求发送者与多个请求处理器之间的耦合。
- 实现方式:所有处理器内部持有下一个处理器的引用,串联形成一条处理链。
- 执行逻辑:请求沿着链条依次传递,每个处理器判断自身是否能处理当前请求;可自行处理,也可转交后继处理器,直至链路末尾。
- 经典原生实现:Java Web Filter过滤器链,请求依次经过filter1、filter2、filter3,最终抵达控制层目标方法,依靠
doFilter()完成链式传递。
二、三大核心角色
1. 抽象处理器 Handler
抽象父类/接口,统一规范:
- 定义处理请求的抽象方法
handler(); - 提供后继处理器成员变量;
- 提供
setNext()方法,用于绑定下一个处理节点。
2. 具体处理器 Concrete Handler
继承/实现抽象Handler,每个类只负责单一处理逻辑:
- 实现
handler()方法,执行业务处理; - 处理完成或自身不具备处理能力时,调用后继处理器的
handler()方法,传递请求。 订单案例中的具体处理器: - OrderValidation:订单参数校验
- OrderFill:填充订单基础数据
- OrderAmountCalculate:订单金额算价
- OrderCreate:订单落库持久化
3. 客户端 Client
- 组装所有处理器,按业务顺序串联构建完整执行链;
- 向链头第一个处理器提交请求;
- 不感知内部传递、处理细节,仅负责发起请求。
配套实体类 OrderInfo
封装待处理的数据载体,存储订单核心信息:productId、userId、amount等,全链路统一传递。
三、订单创建业务执行流程
完整处理链路顺序:检验参数 → 填充订单数据 → 算价 → 落库
- 客户端创建4个处理器实例;
- 通过
setNext()按流程顺序串联,形成完整责任链; - 客户端传入OrderInfo对象,调用链首校验处理器的handler方法;
- 每一步处理器完成自身逻辑后,自动传递给下一个节点;
- 全部节点执行完毕,订单完整创建完成。
四、优缺点
优点
- 解耦:请求发起方与各处理器完全隔离,互不依赖;
- 易扩展:新增处理节点只需新增具体Handler,不修改原有代码,符合开闭原则;
- 灵活调度:客户端可自由调整处理器顺序、增删节点;
- 职责拆分:每个处理器只做单一功能,单一职责;
- 简化对象关联:仅需持有下一个节点引用,无需维护所有处理器关联关系。
缺点
- 性能损耗:链路过长时,请求会遍历大量处理器,影响处理效率;
- 客户端负担重:链条的组装顺序、节点完整性完全由客户端控制,配置错误会引发异常;
- 存在循环风险:若客户端错误设置后继引用,会出现无限循环调用。
五、通用拓展业务场景
所有按固定顺序分步处理、多节点流水线流程均可使用责任链:
- 内容多级审核:文本审核 → 图片审核 → 视频审核;
- 订单全流程:参数校验、数据填充、金额计算、落库、返佣;
- 多级流程审批:组长审批 → 主管审批 → 副总裁审批 → 总裁审批;
- Web过滤器、拦截器、接口参数校验链路、日志处理链路。
六、完整总结(面试背诵版)
- 责任链属于行为型设计模式,核心是将多个处理器串联成链条,请求沿链条传递,解除调用方与处理节点耦合。
- 分为抽象Handler、具体处理器、客户端三大角色,抽象类定义处理接口与后继绑定方法,每个具体处理器只负责单一逻辑。
- 优势是职责单一、扩展灵活、解耦;缺点是长链路性能差,链条组装依赖客户端,易出现循环bug。
- 典型应用:过滤器、多级审批、订单流水线、内容审核等有序分步处理业务。
七、面试简答
问:介绍责任链模式以及适用场景?
答: 责任链模式把多个处理器通过持有下一级引用串联成一条链路,客户端发起请求后,请求会依次经过每一个处理器,处理器可自行处理或向下传递,实现调用方与处理逻辑解耦。 包含三个角色:抽象处理器定义统一处理方法与后继绑定接口;具体处理器实现各自业务逻辑;客户端负责组装链条并发起请求。 优点是职责拆分清晰、新增节点无需修改旧代码、可灵活调整执行顺序;缺点是链条过长会影响性能,组装错误会出现循环调用。 适用场景:过滤器拦截器、多级审批流程、订单分步创建、多媒体内容多级审核等有序流水线业务。