责任链模式 责任链模式,顾名思义,就是用一条执行链,每个节点都可能会对请求做出处理,然后传递给下一个节点继续处理或结束。 废话不多说,直接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);
责任链模式的应用
当请求需要执行多个处理时。
当程序需要用不同的方法处理不同的请求时。
需要动态调整处理顺序时。
以上的一些常见都可以使用责任链模式,其实在很多框架中都用到了责任链模式 比如 Netty中的ChannelPipline,SpringMVC中的Filter,OKHttp中的RealInterceptorChain,Tomcat中的Encoding,MyBatis中的Plugin等等。时间有限,这里就不细细展开了。
责任链模式的优缺点 优点:
可以控制处理请求的顺序
每个处理节点分工明确,符合单一职责
可以通过添加处理节点来新增处理操作
缺点:
由于Hander的增多会导致类的数量很多
节点过多时影响性能
总结 看完了责任链模式,是不是觉得很简单? 就这??
其实设计模式就是这样的,说起来简单,做起来难。 不然也不会有这么多恶心的代码了。 作为程序员, 代码是我们的另一张脸。 学好设计模式,让后人看到你的代码的时候再也不会说出 “这TM哪个sb写的代码”。
Anything can go right will go right