前言
在Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(11)组合模式》文章中,我们介绍了组合模式。本文是这个系列的第十二篇章,我们将讲解一下责任链模式的实现方式、应用场景以及它的用途。
责任链模式
责任链模式是一种行为型设计模式,它允许多个对象来处理请求,并且将这些对象连成一条链。链中的每个处理者(处理对象)都包含对下一个处理者的引用,如果当前处理者无法处理该请求,则会将请求传递给下一个处理者,直到链条的末端。
使用场景
- 请求的多级处理:需要对请求进行多级处理,直到有对象能够处理请求。
- 审批流程:如企业中的请假审批、报销流程等,需要经过多个审批层次。
- 异常处理链:系统或应用程序中,多个模块处理异常的场景。
代码实现
这里使用简易的http 处理框架来简单实现一下这个模式。首先是过滤(Filter)接口,里面有一个doFilter(),接收三个参数Request、Response、FilterChain
/**
* 过滤器接口
* @author Jensen
* @date 2024-04-17
* */
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
Request和Response是两个空类,这里是假设它俩是真实的请求和响应
public class Request { }
public class Response { }
FilterChain是整个链的核心,它是链路的处理者,因为它持有所有的过滤器
/**
* 过滤链路
* @author Jensen
* @date 2024-04-17
* */
public class FilterChain {
private final 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);
}
}
最后是三个过滤器(FilterA、FilterB、FilterC)组合实现于它并形成一条链路,每个过滤器都有它自己的处理逻辑,无论是否处理都会提交到下一个过滤器处理
/**
* 过滤器A
* @author Jensen
* @date 2024-04-17
* */
public class FilterA implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器A处理");
chain.doFilter(request,response);
}
}
/**
* 过滤器B
* @author Jensen
* @date 2024-04-17
* */
public class FilterB implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器B处理");
chain.doFilter(request,response);
}
}
/**
* 过滤器C
* @author Jensen
* @date 2024-04-17
* */
public class FilterC implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器C处理");
chain.doFilter(request,response);
}
}
测试使用
我们在main函数中实现一下这个简易的http过滤器😅
System.out.println("------------------------------责任链模式-----------------------------");
Request request = new Request();
Response response = new Response();
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FilterA());
filterChain.addFilter(new FilterB());
filterChain.addFilter(new FilterC());
filterChain.doFilter(request,response);
输出:
结语
责任链模式在Java中比较经典的应用就是:Servlet框架中,请求被 Servlet 容器传递给过滤器链,每个过滤器都可以对请求进行处理,如果需要将请求传递给下一个过滤器,则需要调用chain.doFilter()方法,直到最终到达Servlet为止。
责任链模式通过将请求沿着处理者链条传递,实现了请求的灵活处理。在多级审批、任务处理、异常处理等场景中,合理使用责任链模式可以降低耦合度,增强灵活性,并且也是符合开闭原则。