我们在平常业务开发或者深入了解一些框架实现时,经常会看到责任链模式的运用。责任链模式,通俗来讲,是若干个处理器组成一条链,当收到请求时,依次经过每个处理器,每个处理器只负责单独的一块逻辑。实现责任链模式有很多种方式,我们由浅入深,共同来探讨如何来实现责任链模式。
考虑一个场景,当我们接受一个用户请求,需要先做登录验证、权限验证、业务验证等许多验证,然后再做业务处理。我们首先想到的是将登录、权限、业务这些验证抽象成一个个过滤器,类似于这样:
public interface Filter {
void doFilter(Request request);
}
登录验证
public class LoginFilter implements Filter {
@Override
public void doFilter(Request request) {
System.out.println("执行登录验证...");
}
}
权限验证
public class AuthorityFilter implements Filter {
@Override
public void doFilter(Request request) {
System.out.println("执行权限验证...");
}
}
业务验证
public class BusinessFilter implements Filter {
@Override
public void doFilter(Request request) {
System.out.println("执行业务验证...");
}
}
然后用过滤器链组装所有的过滤器:
public class FilterChain implements Filter {
private List<Filter> filters = new ArrayList<>();
@Override
public void doFilter(Request request) {
filters.forEach(filter -> filter.doFilter(request));
}
public FilterChain addFilter(Filter filter) {
filters.add(filter);
return this;
}
}
并且按照如下方式进行调用:
@org.junit.Test
public void test1() {
com.example.filterchain.v1.FilterChain chain = new com.example.filterchain.v1.FilterChain();
chain.addFilter(new com.example.filterchain.v1.LoginFilter())
.addFilter(new com.example.filterchain.v1.AuthorityFilter())
.addFilter(new com.example.filterchain.v1.BusinessFilter());
chain.doFilter(new Request());
}
测试结果:
这种方式是基于数组遍历依次调用每个处理器的filter方法来实现各种验证,但是它有一些缺陷:
不能控制过滤器的执行,只能被动执行所有过滤器的处理逻辑
没有返回值,不能在过滤器中加入对返回值的修改
因此我们优化Filter接口及实现:
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
// 登录验证
public class LoginFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("执行登录验证...");
chain.doFilter(request, response);
System.out.println("登录-处理response...");
}
}
// 权限验证
public class AuthorityFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("执行权限验证..."