小蔡学Java

Java之设计模式 (十九)

2023-09-29 23:32 1019 0 设计模式 设计模式责任链模式

责任链模式(Chain of Responsibility Pattern)

  责任链模式是一种行为型设计模式,它允许多个对象来处理请求,并且将这些对象连成一条链。当请求到来时,它会依次经过链上的对象,直到有一个对象能够处理请求为止。   责任链模式和过滤器模式都是行为型设计模式,它们的主要目的是将处理请求的对象组织成一个链,并让请求沿着这个链传递,直到找到能够处理该请求的对象为止。

  那他们有什么区别吗?
  • 用途不同:责任链模式的主要目的是让多个对象都有机会处理同一个请求,而过滤器模式的主要目的是在一个对象中实现多个过滤器,并依次对请求进行处理。

  • 处理方式不同:责任链模式中,每个处理器都会判断自己是否能够处理请求,如果可以则处理请求,并将请求传递给下一个处理器;如果不能处理,则将请求传递给下一个处理器。而过滤器模式中,每个过滤器都是独立的,它们按照一定的顺序依次处理请求,如果某个过滤器不能处理请求,则直接返回。

  • 对象关系不同:责任链模式中,处理器之间通常是单向关系,即每个处理器只知道下一个处理器是谁,而不知道上一个处理器是谁。而过滤器模式中,过滤器之间通常是相互独立的,它们不需要知道彼此的存在。

  • 实现方式不同:责任链模式通常是通过继承或组合的方式实现的,而过滤器模式通常是通过组合的方式实现的。

使用场景

  责任链模式通常用于以下场景:

  • 请求的处理涉及多个对象,并且处理流程需要按顺序进行。
  • 请求的处理方式需要动态决定,或者需要在不同时间处理请求。
  • 在请求处理过程中,需要将请求拆分成多个部分分别处理,最后将它们合并。
  • 需要在不影响客户端的情况下增强处理流程。
  • 需要在系统中动态添加或删除处理器。
  • 处理器之间需要解耦,避免它们之间的直接依赖关系。

代码实现   假设我们有一个处理HTTP请求的框架,其中有多个过滤器(Filter),每个过滤器都可以对请求进行处理,如果当前的过滤器不能处理请求,就将请求交给下一个过滤器。代码如下:

public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}
public class FilterA implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("过滤器A处理请求");
        // 处理请求
        chain.doFilter(request, response);
        // 处理响应
    }
}

public class FilterB implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("过滤器B处理请求");
        // 处理请求
        chain.doFilter(request, response);
        // 处理响应
    }
}

public class FilterChain {
    private List<Filter> filters = new ArrayList<>();
    private int index = 0;

    public void addFilter(Filter filter) {
        filters.add(filter);
    }

    public void doFilter(Request request, Response response) {
        if (index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(request, response, this);
    }
}
public class Request {}
public class Response {}

public class Main {
    public static void main(String[] args) {
        Request request = new Request();
        Response response = new Response();

        FilterChain chain = new FilterChain();
        chain.addFilter(new FilterA());
        chain.addFilter(new FilterB());

        chain.doFilter(request, response);
    }
}

定义了一个Filter接口和两个实现类 FilterA 和 FilterB ,它们都可以对请求进行处理。我们还定义了一个 FilterChain 类,它持有所有的过滤器,当请求到来时,它会依次将请求交给每个过滤器进行处理,直到有一个过滤器能够处理请求为止。


过滤器A处理请求
过滤器B处理请求

使用小结

责任链模式在Java中应用场景比较广泛,例如:

  • 在Java Servlet框架中,请求被 Servlet 容器传递给过滤器链,每个过滤器都可以对请求进行处理,如果需要将请求传递给下一个过滤器,则需要调用chain.doFilter()方法,直到最终到达Servlet为止。

  • 在Spring框架中,责任链模式被广泛应用于AOP和数据源路由等方面。在AOP方面,每个切面可以定义多个切点,并且可以定义切点的顺序,每个切点都可以对方法进行前置或后置处理,或者抛出异常;在数据源路由方面,可以根据不同的业务需求,将请求路由到不同的数据源进行处理。

  • 在MyBatis框架中,责任链模式被用于SQL解析和SQL执行等方面。在解析方面,将SQL解析成AST(Abstract Syntax Tree)树,并且可以通过责任链模式,将不同的解析器组合起来,实现多种SQL语法的解析

评论( 0 )

  • 博主 Mr Cai
  • 坐标 河南 信阳
  • 标签 Java、SpringBoot、消息中间件、Web、Code爱好者

文章目录