责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
Tomcat 中的 Pipeline-Valve 实际上就是责任链模式,责任链模式是指在一个请求处理的过程中有多个处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完成后将处理后的请求返回,再让下一个处理者继续处理,就好像驾车的过程中可能会遇到很多次交警检查,可能有查酒驾的也可能有查违章的,在一次驾车的过程中可能会遇到多次检查,这就是责任链模式,Pipeline 就相当于驾车的过程, Valve 相当于检查的交警。
不过Pipeline-Valve 的管道模型和普通的责任链模式稍微有点不同,区别主要有两点:
下面代码即为实现了Value接口的基础类ValveBase,它有一个Value类型的内部属性next,即同一个Pipeline中的后续Valve的引用。类似于单向链表。继承这个ValveBase针对不同的容器实现了不同版本的阀如StandardEngineValve,StandardHostValve,StandardContextValve,StandardWrapperValve等。他们之间不同的实现就是invoke和event的方法不同。而实际上也就是请求的路由选择,Filter应用和Servlet的处理。
public abstract class ValveBase extends LifecycleMBeanBase implements Contained, Valve { /** * The next Valve in the pipeline this Valve is a component of. */ protected Valve next = null; @Override public Container getContainer() { return (container); } @Override public void setContainer(Container container) { this.container = container; } @Override public Valve getNext() { return (next); } @Override public void setNext(Valve valve) { this.next = valve; } @Override public abstract void invoke(Request request, Response response) throws IOException, ServletException; @Override public void event(Request request, Response response, CometEvent event) throws IOException, ServletException { // Perform the request getNext().event(request, response, event); } }
责任链模式之——Pipeline-Valve 管道(Tomcat)分析及仿写
原文:https://www.cnblogs.com/zjfjava/p/13676540.html