责任链模式(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 )