1.概念
1.1 什么是责任链模式
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许多个对象处理一个请求,或者将这些对象连成一条链。在责任链模式中,请求从链的一端开始,依次经过每个处理者对象,直到有对象处理它为止。每个处理者都有机会处理请求,也有机会将请求传递给链上的下一个处理者。
1.2 优点与缺点
优点:
1.降低请求的发送者和接收者之间的耦合关系。
2.请求的发送者不需要知道链中的具体结构。
3.可以动态地添加或修改处理者。
缺点:
1.请求可能在链中得不到处理,需要有机制保证请求被正确处理。
2.系统性能问题,因为请求可能需要在链中传递多次。
2.实现方式
// 抽象处理者接口
public interface Handler {
void setNext(Handler handler);
void handleRequest(int request);
}
// 具体处理者实现
public class ConcreteHandler1 implements Handler {
private Handler nextHandler;
public void setNext(Handler handler) {
this.nextHandler = handler;
}
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("ConcreteHandler1 handled the request " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
public class ConcreteHandler2 implements Handler {
private Handler nextHandler;
public void setNext(Handler handler) {
this.nextHandler = handler;
}
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("ConcreteHandler2 handled the request " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
public class ConcreteHandler3 implements Handler {
private Handler nextHandler;
public void setNext(Handler handler) {
this.nextHandler = handler;
}
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("ConcreteHandler3 handled the request " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
handler1.setNext(handler2);
handler2.setNext(handler3);
// 发送请求
handler1.handleRequest(5); // 应该由 ConcreteHandler1 处理
handler1.handleRequest(15); // 应该由 ConcreteHandler2 处理
handler1.handleRequest(25); // 应该由 ConcreteHandler3 处理
}
}
3. Java 哪些地方用到了责任链模式
事件处理
:
Java的AWT(Abstract Window Toolkit)和Swing事件模型使用了责任链模式。当一个事件发生时,它会沿着组件的层级结构传递,直到被某个事件监听器处理。
动态代理
:
在动态代理中,调用处理器(InvocationHandler)可以形成一个责任链,用于拦截和处理对代理实例的调用。
Servlet 过滤器(Filter)
:
Java Servlet API允许你定义过滤器,这些过滤器可以形成一个链,用于处理HTTP请求和响应。每个过滤器都有机会修改请求或响应,或者将处理传递给链中的下一个过滤器。
JAX-RS 资源方法处理
:
在JAX-RS(Java API for RESTful Web Services)中,可以定义多个拦截器和异常映射器,它们可以形成一个责任链,用于处理RESTful请求。
Java EE 拦截器
:
在Java EE中,拦截器可以定义为一个责任链,用于在调用企业Bean的方法之前或之后执行某些操作。
Java 安全管理器
:
在Java的安全管理器中,可以使用责任链模式来处理安全检查。每个安全检查请求可以沿着安全管理器链传递,直到找到能够处理该请求的管理器。
日志记录
:
一些日志框架(如Log4j或SLF4J)允许你定义多个日志处理器,这些处理器可以形成一个责任链,用于决定如何记录不同级别的日志信息。
JDBC 驱动管理
:
Java的JDBC(Java Database Connectivity)驱动管理器使用责任链模式来查找和加载合适的JDBC驱动。
命令模式的实现
:
在命令模式中,可以使用责任链模式来处理撤销和重做操作,每个命令可以有自己的撤销和重做链。
异常处理
:
在Java中,异常处理机制也可以看作是一种责任链模式。当异常被抛出时,它会在调用栈中向上传递,直到找到合适的异常处理块。
4. Spring 哪些地方用到了责任链模式
Spring Web MVC 拦截器(HandlerInterceptor)
:
Spring MVC提供了一个拦截器机制,允许你在请求处理之前和之后执行特定的操作。拦截器可以形成一个链,每个拦截器都有机会在请求到达控制器之前或之后进行处理。
Spring AOP 切面
:
Spring的AOP(面向切面编程)机制允许你定义切面,这些切面可以拦截对目标对象的方法调用。切面可以形成一个责任链,用于在方法执行前后执行横切关注点(如日志记录、安全检查等)。
Spring Security 过滤器链
:
Spring Security使用过滤器链来处理安全相关的请求。每个过滤器都有机会处理请求,或者将请求传递给链中的下一个过滤器。
事件多播器
(ApplicationEventMulticaster):
Spring的事件发布机制允许你定义多个事件监听器。当事件被发布时,事件多播器会将事件传递给所有的监听器,这可以看作是一种责任链模式。
Spring 事务管理
:
Spring的事务管理器可以看作是一个责任链,它负责在方法执行前后处理事务的开启、回滚和提交。
Spring 异常处理
:
Spring提供了异常处理机制,允许你定义多个异常处理器。当异常发生时,异常处理器链会尝试处理异常,直到找到合适的处理器。
Spring Boot 自动配置
:
Spring Boot的自动配置机制允许你定义多个配置类,这些配置类可以形成一个责任链,用于条件性地应用配置。
Spring Cloud Gateway 过滤器
:
Spring Cloud Gateway是一个基于Spring Framework 5、Project Reactor和Spring Boot 2的微服务网关,它提供了过滤器机制,这些过滤器可以形成一个责任链,用于处理请求和响应。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【设计模式】责任链模式(行为型)⭐⭐
发表评论 取消回复