责任链模式
解释
将多个逻辑串成一条链路,按照链路依次执行
代码维度
举例
通过处理论坛发布消息来举例
发布消息需要通过多次检查
- 安全性检查
- 敏感词检查
- …
功能实现
-
通过过滤器来实现
new XXXFilter().doFilter(msg); new XXXFilter().doFilter(msg);
-
将多个过滤器封装到list中
List<Filter> filters = new ArrayList(); filters.add(new XXXFilter()); filters.add(new XXXFilter()); for(Filter f : filters){ f.doFilter(msg); }
-
责任链模式
- 多个链路可以直接连接到一起,即整个链路可以看作为一个Filter
public static void main(){ FilterChain fc = new FilterChain(); fc.add(new HTMLFilter()).add(new SensitiveFilter()); FilterChain fc2 = new FilterChain(); fc2.add(new FaceFilter()).add(new URLFilter()); fc.add(fc2); fc.doFilter(msg); }
- 链路执行过程中随时可以停止,不往下执行
public boolean doFilter(Msg m) { for(Filter f : filters) { if(!f.doFilter(m)) return false; } return true; }
扩展
ServletFilterChain
处理Request和Response
比如有两个Filter,FilterA和FilterB,要求A先处理Req,然后B处理Req,然后B处理Res,然后A处理Res
class SensitiveFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.str = request.str.replaceAll("996", "955") + " SensitiveFilter()";
chain.doFilter(request, response);
response.str += "--SensitiveFilter()";
}
}
class FilterChain {
List<Filter> filters = new ArrayList<>();
int index = 0;
public FilterChain add(Filter f) {
filters.add(f);
return this;
}
public void doFilter(Request request, Response response) {
if(index == filters.size()) return;
Filter f = filters.get(index);
index ++;
f.doFilter(request, response, this);
}
}
知识点
设计模式就是要封装变化