【设计模式】责任链模式(行为型)⭐⭐

发布于:2024-06-12 ⋅ 阅读:(18) ⋅ 点赞:(0)

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的微服务网关,它提供了过滤器机制,这些过滤器可以形成一个责任链,用于处理请求和响应。