责任链模式

责任链模式

责任链模式,顾名思义,就是用一条执行链,每个节点都可能会对请求做出处理,然后传递给下一个节点继续处理或结束。

废话不多说,直接show code。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {
Request request = new Request();
String json = "{\"name\":\"request\",\"age\":\"18\",\"sex\":\"男\"}";
request.setRequest(JSONObject.parseObject(json));

if (request!=null){
System.out.println(request);
}
if (request.getRequest()!=null){
System.out.println(request.getRequest());
}
if (request.getRequest().get("name")!=null){
System.out.println(request.getRequest().get("name"));
}
if (request.getRequest().get("age")!=null){
System.out.println(request.getRequest().get("age"));
}
if (request.getRequest().get("sex")!=null){
System.out.println(request.getRequest().get("sex"));
}
}

像这样多个if组成的链式处理数据,在开发中是非常常见的,但是当处理代码量大的时候、if语句过多的时候,代码会变得很难维护,并且职责不清晰。当整个方法中的代码超过一定的量的时候,再让你去在一个处理中增加一些功能点的时候,想象一下那个画面, 肯定很痛苦。
其实责任链模式就是把一个或多个if中的操作,当作一个节点,而所有节点组成的处理链可以说就是责任链。

我们把if抽象成Handler

1
2
3
public interface Handler {
void handler(Request request);
}
1
2
3
4
5
6
7
8
public class OneHandler implements Handler {
@Override
public void handler(Request request) {
if (request!=null){
System.out.println(request);
}
}
}
1
2
3
4
5
6
7
8
public class TwoHandler implements Handler {
@Override
public void handler(Request request) {
if (request.getRequest()!=null){
System.out.println(request.getRequest());
}
}
}

再把要用到的Hander放到HandlerChain中,构成处理链。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class HandlerChain implements Handler {
private static List<Handler> handlerChain;
static {
handlerChain = new ArrayList<>();
handlerChain.add(new OneHandler());
handlerChain.add(new TwoHandler());
handlerChain.add(new ThreeHandler());
handlerChain.add(new FourHandler());
handlerChain.add(new FiveHandler());
}
@Override
public void handler(Request request) {
for (Handler handler:handlerChain){
handler.handler(request);
}
}
}

最终,我们只需要把请求交给HandlerChain,由他来处理就行了。

1
2
HandlerChain handlerChain = new HandlerChain();
handlerChain.handler(request);

责任链模式的应用

  1. 当请求需要执行多个处理时。
  2. 当程序需要用不同的方法处理不同的请求时。
  3. 需要动态调整处理顺序时。

以上的一些常见都可以使用责任链模式,其实在很多框架中都用到了责任链模式
比如 Netty中的ChannelPipline,SpringMVC中的Filter,OKHttp中的RealInterceptorChain,Tomcat中的Encoding,MyBatis中的Plugin等等。时间有限,这里就不细细展开了。

责任链模式的优缺点

优点:

  1. 可以控制处理请求的顺序
  2. 每个处理节点分工明确,符合单一职责
  3. 可以通过添加处理节点来新增处理操作

缺点:

  1. 由于Hander的增多会导致类的数量很多
  2. 节点过多时影响性能

总结

看完了责任链模式,是不是觉得很简单? 就这??

其实设计模式就是这样的,说起来简单,做起来难。 不然也不会有这么多恶心的代码了。
作为程序员, 代码是我们的另一张脸。 学好设计模式,让后人看到你的代码的时候再也不会说出 “这TM哪个sb写的代码”。