前言
-
这个系列主要讲优秀的开源框架对于责任链这个设计模式的运用,对于好的设计,我们关键是学习他的思想并运用在我们的编码中。
-
这个系列的所有代码都是我根据源码提炼之后的代码,不依赖原项目或框架,可以直接跑。
-
我不会讲每个具体是如何实现的,如果你觉得光看代码比较吃力,那么可以将代码复制下来,自己多运行几遍,我相信你一定能掌握。
-
欢迎访问我的个人网站,里面有超多开源组件和项目,另外还有付费项目和博客,地址:https://openbytecode.com/
-
本小节是这个系列第一篇,主要讲责任链设计模式在 Tomcat 的 Filter 中的运用。
-
本系列 Github 地址:https://github.com/lijunping365/Open-Design
Tomcat 之 Filter
public interface Filter {
void doFilter(HttpRequest request, HttpResponse response, FilterChain chain);
}
public interface FilterChain {
void addFilter(Filter filter);
/**
* 回调入口
* @param request
* @param response
*/
void doFilter(HttpRequest request, HttpResponse response);
}
下面两个可以当作 HttpServletRequest 和 HttpServletResponse 来理解
public class HttpRequest {
}
public class HttpResponse {
}
Filter 的默认实现
public class DefaultFilter implements Filter{
@Override
public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
System.out.println("DefaultFilter ................Before");
chain.doFilter(request, response);
System.out.println("DefaultFilter ................After");
}
}
这个类是核心
public class DefaultFilterChain implements FilterChain{
private static final Integer CAP = 10;
private Filter[] filters = new Filter[CAP];// 初始化大小
private int pos;// 当前 Filter
private int n;// 当前 filter length
@Override
public void addFilter(Filter filter) {
if (n == filters.length){
Filter[] newFilters = new Filter[n + CAP];
System.arraycopy(this.filters, 0, newFilters, 0, this.filters.length);
filters = newFilters;
}
filters[n++] = filter;
}
@Override
public void doFilter(HttpRequest request, HttpResponse response) {
if (pos < n){
final Filter filter = filters[pos++];
filter.doFilter(request, response, this);
}
}
}
测试
public class FirstFilter implements Filter {
@Override
public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
System.out.println("FirstFilter ................Before");
chain.doFilter(request, response);
System.out.println("FirstFilter ................After");
}
}
public class SecondFilter implements Filter {
@Override
public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
System.out.println("SecondFilter ................Before");
chain.doFilter(request, response);
System.out.println("SecondFilter ................After");
}
}
public class ThirdFilter implements Filter {
@Override
public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
System.out.println("ThirdFilter ................Before");
chain.doFilter(request, response);
System.out.println("ThirdFilter ................After");
}
}
public class FilterTest {
public static void main(String[] args) {
DefaultFilterChain filterChain = new DefaultFilterChain();
filterChain.addFilter(new FirstFilter());
filterChain.addFilter(new SecondFilter());
filterChain.addFilter(new ThirdFilter());
filterChain.doFilter(new HttpRequest(), new HttpResponse());
}
}
输出结果
FirstFilter ................Before
SecondFilter ................Before
ThirdFilter ................Before
ThirdFilter ................After
SecondFilter ................After
FirstFilter ................After
欢迎在评论区留下你的总结,一起交流探讨