🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 责任链模式 Chain of Responsibility Pattern,为请求创建了由接受者对象组成的链,通过这种模式发送的请求,可以对请求的发送者和接受者进行解耦。 同时在这种模式中每个接收者都包含对另外一个接收者的引用,使得如果当前接收者不能处理,可以将请求传递给下一个接收者处理。例如在Netty的入站处理器的pipeline中,每个处理器需要调用ctx.fireChannelRead(msg)将msg移交给下一个处理器处理。 责任链模式适用于解决当处理消息的时候有很多道“过滤”程序的场景,例如Java Web中的拦截器、Tomcat对Encoding的处理、JS的事件冒泡、Netty中的出入站处理器。   ## 组成 1. Handler:定义处理请求的接口,并且实现其后继链节点(successor)。 2. handlerRequest:定义处理请求的方法,每个具体的Handler接口都需要重写handlerRequest方法来实现特点的处理。 **实现** 1. 定义Handler接口 ~~~ public abstract class Handler { // 后继处理链 protected Handler successor; public Handler(Handler successor) { this.successor = successor; } // 处理请求的方法 protected abstract void handleRequest(Request request); } ~~~ 2. 定义具体的Handler实现类 ~~~ public class ConcreteHandler1 extends Handler { public ConcreteHandler1(Handler successor) { super(successor); } @Override protected void handleRequest(Request request) { if (request.getType() == RequestType.TYPE1) { System.out.println(request.getName() + " is handle by ConcreteHandler1"); return; } if (successor != null) { // 交由下一个处理器处理 successor.handleRequest(request); } } } ~~~     JDK中实现责任链模式的代码: * [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29) * [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html) * [javax.servlet.Filter#doFilter()](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html#doFilter-javax.servlet.ServletRequest-javax.servlet.ServletResponse-javax.servlet.FilterChain-)