责任链(Chain)模式:避免多个处理者耦合在一起,通过对象记录下一个对象的引用而形成的处理链条。
以Filter过滤器为例:
/**
* @description: 过滤器接口
* @author: jiang
*/
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
/**
* @description: 过滤器链
* @author: jiang
*/
public interface FilterChain {
void doFilter(Request request, Response response);
}
/**
* @description: 默认过滤器链条维护者
* @author: jiang
*/
public class DefaultFilterChain implements FilterChain {
//游标
int cursor = 0;
//过滤器链
List<Filter> filterChains = new ArrayList<>();
/**
* 添加过滤器
* @param filter
*/
void addFilter(Filter filter){
filterChains.add(filter);
}
/**
* 执行过滤
* @param request
* @param response
*/
@Override
public void doFilter(Request request, Response response) {
if(cursor!=filterChains.size()){
Filter filterChain = filterChains.get(cursor);
cursor++;
filterChain.doFilter(request,response,this);
}
}
}
/**
* @description: HTTP协议解析过滤
* @author: jiang
*/
public class HttpFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("开始HTTP协议解析");
chain.doFilter(request,response);
System.out.println("结束HTTP协议解析");
}
}
/**
* @description: 认证鉴权过滤器
* @author: jiang
*/
public class AuthFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("开始认证鉴权");
chain.doFilter(request,response);
System.out.println("结束认证鉴权");
}
}
public static void main(String[] args) {
Filter httpFilter = new HttpFilter();
Filter authFilter = new AuthFilter();
DefaultFilterChain filterChain = new DefaultFilterChain();
filterChain.addFilter(httpFilter);
filterChain.addFilter(authFilter);
filterChain.doFilter(null,null);
}
结果:
开始HTTP协议解析
开始认证鉴权
结束认证鉴权
结束HTTP协议解析