深入理解设计模式之职责链模式
下面是一篇关于设计模式之职责链模式(Chain of Responsibility Pattern)的详细博客,并附有 Java 实现代码示例。
深入理解设计模式之:职责链模式(Chain of Responsibility Pattern)
一、什么是职责链模式?
职责链模式是一种行为型设计模式。它将请求的发送者和接收者解耦,让多个接收对象都有机会处理这个请求。将这些接收对象连成一条链,请求沿着链传递,直到有对象处理它为止。
核心思想:
请求发送者无需关心请求由谁处理,链上的每个节点都可以选择处理请求或将其传递给下一个节点。
二、应用场景
- Web 框架中的过滤器链、拦截器链(如 Spring MVC Filter、Servlet Filter)
- 日志处理链(不同级别日志处理器)
- 审批流程(如请假、报销等多级审批)
- 责任分级处理(如异常处理、权限校验)
三、模式结构
- Handler(抽象处理者):定义处理请求的接口,并持有下一个处理者的引用
- ConcreteHandler(具体处理者):实现处理逻辑,决定是否处理请求或传递给下一个处理者
- Client(客户端):创建链并发起请求
四、UML 类图
+------------------+
| Handler |<-------------------+
+------------------+ |
| next: Handler | |
| +setNext() | |
| +handleRequest() | |
+------------------+ |/_\ || |
+---------------------+ +---------------------+
| ConcreteHandlerA | | ConcreteHandlerB |
+---------------------+ +---------------------+
| +handleRequest() | | +handleRequest() |
+---------------------+ +---------------------+
五、Java 实现代码示例
1. 抽象处理者
public abstract class Handler {protected Handler next;public void setNext(Handler next) {this.next = next;}public abstract void handleRequest(String request);
}
2. 具体处理者
public class AuthHandler extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("auth")) {System.out.println("AuthHandler 处理了请求");} else if (next != null) {next.handleRequest(request);} else {System.out.println("请求未被处理");}}
}public class LoggingHandler extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("log")) {System.out.println("LoggingHandler 处理了请求");} else if (next != null) {next.handleRequest(request);} else {System.out.println("请求未被处理");}}
}public class BusinessHandler extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("business")) {System.out.println("BusinessHandler 处理了请求");} else if (next != null) {next.handleRequest(request);} else {System.out.println("请求未被处理");}}
}
3. 客户端组装链并发起请求
public class Main {public static void main(String[] args) {Handler auth = new AuthHandler();Handler log = new LoggingHandler();Handler business = new BusinessHandler();// 组装链:auth -> log -> businessauth.setNext(log);log.setNext(business);// 发起不同请求auth.handleRequest("auth"); // 输出:AuthHandler 处理了请求auth.handleRequest("log"); // 输出:LoggingHandler 处理了请求auth.handleRequest("business"); // 输出:BusinessHandler 处理了请求auth.handleRequest("other"); // 输出:请求未被处理}
}
六、扩展用法
1. 动态链路组装
链可以在运行时动态组装,灵活应对不同业务场景。
2. 责任链终止
链上的某个节点可以选择终止请求传递(如 return),也可以继续传递。
3. Spring 框架中的应用
Spring Security、Spring MVC Filter、AOP 拦截器等大量用到职责链思想。
七、优缺点
优点:
- 解耦请求发送者和处理者
- 动态组合链路,灵活扩展
- 符合开闭原则,易于添加新处理者
缺点:
- 可能导致链过长,影响性能
- 调试和链路追踪相对复杂
八、总结
职责链模式是实现请求处理解耦、灵活扩展的经典方案,广泛应用于中间件、审批流、日志处理等场景。掌握职责链模式有助于编写高内聚、低耦合的代码结构。
建议:
- 适合多级处理、可扩展的业务场景
- 注意链路长度和性能监控
如需更多设计模式讲解或源码分析,欢迎留言交流!