🚩什么是责任链设计模式?
责任链设计模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
使用场景
当需要 多个对象可以处理同一个请求,但具体由哪个对象处理在运行时动态决定时
当需要 在不明确指定接收者的情况下向多个对象中的一个提交请求 时
当需要 动态指定一组对象处理请求 时(如审批流程、异常处理等)
🚩责任链设计模式的特点
解耦请求发送者和接收者:发送者无需知道具体由哪个对象处理请求
动态组合处理链:可以动态地添加或修改处理请求的责任链
灵活性高:可以灵活地分配责任或改变处理顺序
多种处理方式:请求可以被链中的某个对象处理,也可以不被任何对象处理
🚩责任链设计模式的结构
责任链模式主要包含以下部分:
Handler(抽象处理者):定义处理请求的接口,通常包含设置下一个处理者的方法和处理请求的方法
ConcreteHandler(具体处理者):实现处理请求的具体逻辑,如果不能处理则转发给下一个处理者
Client(客户端):创建处理链并向链头的处理者提交请求
🚩责任链设计模式的优缺点
✅ 优点
降低耦合度:请求发送者只需知道链中的第一个处理者
增强灵活性:可以动态地增加或修改处理链
简化对象间的连接:每个处理者只需保持一个指向其后继者的引用
分配责任更灵活:可以自由分配责任或改变责任顺序
❌ 缺点
请求可能不被处理:如果没有处理者能够处理请求,它可能会到达链的末端并被丢弃
性能问题:较长的责任链可能会影响性能,特别是在链的末端才找到处理者时
调试困难:请求的传递过程可能比较复杂,不容易调试
🚩责任链设计模式的Java实现
代码地址:GitHub
- 创建
抽象主题 Handler接口
/**
* @author hanson.huang
* @version V1.0
* @ClassName Handler
* @Description 抽象类定义了处理请求的接口和设置下一个处理者的方法
* @date 2025/3/25 15:45
**/
public abstract class Handler {
protected Handler next;
public void setNext(Handler next) {
this.next = next;
}
public abstract void HandlerRequest(int request);
}
创建三个具体的处理者,实现自己的逻辑
- FuDaoYuan处理者
/** * @author hanson.huang * @version V1.0 * @ClassName FuDaoYuan * @Description FuDaoYuan处理者 * @date 2025/3/25 15:47 **/ public class FuDaoYuan extends Handler { // <= 7 审批 @Override public void HandlerRequest(int request) { if (request <= 7) { System.out.println("辅导员审批通过"); } else { if (next != null) { next.HandlerRequest(request); } else { System.out.println("无法审批"); } } } }
- YuanZhang处理者
/** * @author hanson.huang * @version V1.0 * @ClassName YuanZhang * @Description YuanZhang处理者 * @date 2025/3/25 15:51 **/ public class YuanZhang extends Handler { @Override public void HandlerRequest(int request) { if (request <= 15) { System.out.println("院长审批通过"); } else { if (next != null) { next.HandlerRequest(request); } else { System.out.println("无法审批"); } } } }
- XiaoZhang处理者
/** * @author hanson.huang * @version V1.0 * @ClassName XiaoZhang * @Description XiaoZhang处理者 * @date 2025/3/25 15:52 **/ public class XiaoZhang extends Handler { @Override public void HandlerRequest(int request) { if (request <= 30) { System.out.println("校长审批通过"); } else { if (next != null) { next.HandlerRequest(request); } else { System.out.println("无法审批"); } } } }
测试责任链模式
/**
* @author hanson.huang
* @version V1.0
* @ClassName ChainOfResponsibilityPattern
* @Description 测试责任链模式
* @date 2025/3/25 15:54
**/
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
FuDaoYuan fuDaoYuan = new FuDaoYuan();
YuanZhang yuanZhang = new YuanZhang();
XiaoZhang xiaoZhang = new XiaoZhang();
fuDaoYuan.setNext(yuanZhang);
yuanZhang.setNext(xiaoZhang);
fuDaoYuan.HandlerRequest(31);
fuDaoYuan.HandlerRequest(25);
}
}
📌 运行结果
传入31时,显示无法审批
传入25时,校长审批通过
🚩代码总结
Handler 抽象类定义了处理请求的接口和设置下一个处理者的方法
FuDaoYuan、YuanZhang、XiaoZhang 是具体的处理者,实现了自己的处理逻辑
ChainOfResponsibilityPattern 类构建了处理链并触发请求
每个处理者如果不能处理当前请求,会将请求传递给链中的下一个处理者
🚩总结
责任链设计模式 通过构建一条处理链来解耦请求发送者和接收者
核心是 让多个对象都有机会处理请求,避免请求发送者与接收者之间的耦合
适用于 多级审批、异常处理、事件传递 等场景
✅ Java源码中的应用场景:
Java Servlet中的FilterChain:
javax.servlet.FilterChain
多个Filter组成责任链处理HTTP请求
Java异常处理机制:
- 异常在调用栈中向上传播的过程就是责任链模式的应用
Spring Security的过滤器链:
- 多个安全过滤器组成责任链处理安全相关逻辑
Netty的ChannelPipeline:
- 处理器链处理网络事件
AWT/Swing事件处理:
- 事件在组件层次结构中的传播
Log4j/Logback日志框架:
- 日志级别过滤和处理的链式结构
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️