责任链模式
承接上一篇内容常用设计模式-责任链模式
责任链模式在许多框架中都有很广泛的应用, 比如Servlet中的Filter, Netty中的Channel等, 我们模拟Servlet中的filter加深对责任链模式的理解, 实现请求从A->B->C->B->A的执行顺序。
码云地址地址:design_patterns
创建Filter接口
public interface Filter<T, R, E> {
void doFilter(T t, R r, E e);
}
创建FileterChian
public interface FilterChain<T, R> {
void doFilter(T t, R r);
}
public class ApplicationFilterChain implements FilterChain<Request, Response>{
private final List<Filter<Request, Response, FilterChain<Request, Response>>> filters;
private int index = 0;
public ApplicationFilterChain(){
filters = new ArrayList<>();
}
public ApplicationFilterChain setNextFilter(Filter<Request, Response, FilterChain<Request, Response>> nextFilter){
if (!filters.contains(nextFilter)){
filters.add(nextFilter);
}
return this;
}
@Override
public void doFilter(Request request, Response response) {
//执行下一个链方法
if (index < filters.size()){
filters.get(index++).doFilter(request, response, this);
}
}
}
创建Filter接口实现类, HttpFilter,SocketFilter,FileFilter
public class FileFilter implements Filter<Request, Response, FilterChain<Request, Response>>{
@Override
public void doFilter(Request request, Response response, FilterChain<Request, Response> filterChain) {
System.out.println("执行File拦截器");
filterChain.doFilter(request, response);
System.out.println("执行File2拦截器");
}
}
public class HttpFilter implements Filter<Request, Response, FilterChain<Request, Response>>{
@Override
public void doFilter(Request request, Response response, FilterChain<Request, Response> filterChain) {
System.out.println("执行Http拦截器");
filterChain.doFilter(request, response);
System.out.println("执行Http2拦截器");
}
}
public class SocketFilter implements Filter<Request, Response, FilterChain<Request, Response>> {
@Override
public void doFilter(Request request, Response response, FilterChain<Request, Response> filterChain) {
System.out.println("执行Socket拦截器");
filterChain.doFilter(request, response);
System.out.println("执行Socket2拦截器");
}
}
执行测试
public static void main(String[] args) {
Request request = new Request();
Response response = new Response();
HttpFilter httpFilter = new HttpFilter();
SocketFilter socketFilter = new SocketFilter();
FileFilter fileFilter = new ApplicationFilterChain();
FilterChain requestFilter = new FilterChain();
requestFilter.setNextFilter(httpFilter)
.setNextFilter(socketFilter)
.setNextFilter(fileFilter);
requestFilter.doFilter(request, response);
}
执行结果
执行Http拦截器
执行Socket拦截器
执行File拦截器
执行File2拦截器
执行Socket2拦截器
执行Http2拦截器
可以看到核心思想为filter持有FilterChain的引用对象, FilterChain维护filter链。在filter子类实现中通过调用filterChain.doFilter(request, response)方法完成对FilterChain的递归调用。