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的微服务网关,它提供了过滤器机制,这些过滤器可以形成一个责任链,用于处理请求和响应。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |