1. 概念
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
2. 适用场景
1)当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时, 可以使用责任链模式。
2)当必须按顺序执行多个处理者时, 可以使用该模式。
3)如果所需处理者及其顺序必须在运行时进行改变, 可以使用责任链模式。
3. 示例
一个消息发布场景,对于敏感信息的过滤,每层过滤处理不同的敏感信息。
信息内容为:大家好:),<script>,欢迎访问 baidu.com ,大家都是996
第一层过滤处理<> 替换为[]
第二层过滤处理996 替换为955
每层过滤处理,既能处理res信息,又能处理服务器rep的信息
如:请求信息经历1,2过滤处理,响应信息经历2,1过滤处理
屏幕快照 2021-01-14 下午11.27.28.png
- Filter接口:
interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
- HTMLFilter实现:
class HTMLFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.str = request.str.replaceAll("<", "[").replaceAll(">", "]") + "HTMLFilter()";
chain.doFilter(request, response);
response.str += "--HTMLFilter()";
}
}
- SensitiveFilter实现:
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 Request {
String str;
}
class Response {
String str;
}
- FilterChain:
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);
}
}
- 场景类:
public static void main(String[] args) {
Request request = new Request();
request.str = "大家好:),<script>,欢迎访问 baidu.com ,大家都是996 ";
Response response = new Response();
response.str = "response";
FilterChain chain = new FilterChain();
chain.add(new HTMLFilter()).add(new SensitiveFilter());
chain.doFilter(request, response);
System.out.println(request.str);
System.out.println(response.str);
}
- 输出结果:
大家好:),[script],欢迎访问 baidu.com ,大家都是955 HTMLFilter() SensitiveFilter()
response--SensitiveFilter()--HTMLFilter()
4. 总结
- 优点
责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。 - 缺点
责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。
————————————————————
坐标帝都,白天上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注
网友评论