模板方法模式
模板方法模式抽象出某个业务操作公共的流程,将流程分为几个步骤,其中有一些步骤是固定不变的,有一些步骤是变化的,固定不变的步骤通过一个基类来实现,而变化的部分通过钩子方法让子类去实现,这样就实现了对系统中流程的统一化规范化管理。
Tomcat中关于生命周期管理应用了模板方法模式,在一个组件的生命周期中都会涉及到init(初始化),start(启动),stop(停止),destory(销毁),而对于每一个生命周期阶段其实都有固定一些事情要做,比如判断前置状态,设置后置状态,以及通知状态变更事件的监听者等,而这些工作其实是可以固化的,所以Tomcat中就将每个生命周期阶段公共的部分固化,然后通过initInternal,startInternal,stopInternal,destoryInternal这几个钩子方法开放给子类去实现具体的逻辑。
tomcat的所有容器都实现了Lifecycle的生命周期管理接口
基类LifecycleBase实现了Lifecycle接口并实现init、start、stop、destroy等方法。
init()方法内部模板化初始化流程,抽象具体的实现initInternal()方法。
start()方法内部模板化启动流程,抽象具体的实现startInternal()方法。
stop()方法内部模板化停止流程,抽象具体的实现stopInternal()方法。
destroy()方法内部模板化释放流程,抽象具体的实现destroyInternal()方法。
Tomcat状态转移图
1 | public interface Lifecycle { |
LifecycleBase基实现类:
1 | public abstract class LifecycleBase implements Lifecycle { |
工厂模式
在Tomcat启动的过程中,调用Connector的startInternal()启动中,启动endpoint后bind的方法,初始化endpoint就是使用了工厂模式创建socket
观察者模式
观察者模式的定义,有多个对象在关注着一个对象,如果这个对象的状态发生了改变,其它依赖(关注)它的对象就会收到通知,然后在接收到通知以后各个对象做出相应的动作。
观察者
1 | /** 观察者的事件对象继承了EventObject类 |
被观察者
被观察者实现接口Lifecycle,实现addLifecycleListener和removeLifecycleListener方法。
容器的基类LifecycleBase实现了被观察者功能,提供List<LifecycleListener> lifecycleListeners保存被观察者。
容器的具体实现当中都是继承LifecycleBase类,所以包含了被观察者的功能。
1 | public interface Lifecycle { |
责任链模式
责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。
在tomcat中容器之间,当一个请求过来的时候首先是engine容器接受请求,然后engine容器会把请求传到host容器,host容器又会传到context容器,context容器传到wrapper容器,最后wrapper容器使用适配请求的servlet处理请求。
组成:
- Valve Valve作为职责链上的每个节点,主要用于处理流到该节点的request对象。
- Pipeline Pipeline作为职责链对象,主要维护Valve职责链节点对象。
1 | public interface Valve { |
一个Pipeline上面可以有很多Valve,这些Valve存放的方式并非统一存放在Pipeline中,而是像一个链表一个接着一个。当你获取到一个Valve实例的时候,调用getNext()方法即可获取在这个Pipeline上的下个Valve实例。
Pipeline中很多的方法都是操作Valve的,包括获取,设置,移除Valve,getFirst()返回的是Pipeline上的第一个Valve,而getBasic(),setBasic()则是获取/设置基础阀,我们都知道在Pipeline中,每个pipeline至少都有一个阀门,叫做基础阀,而getBasic(),setBasic()则是操作基础阀的。
1 | /** |
每个容器包含职责链对象Pipeline。
每个职责对象Valve的具体实现当中会包含下一个容器对象,相当于Valve对象内部会访问下一个容器,进而实现职责链传递。
整个Http请求被处理的流程:
- 请求被Connector组件接收,创建Request和Response对象。
- Connector将Request和Response交给Container,先通过Engine的pipeline组件流经内部的每个Valve。
- 请求流转到Host的pipeline组件中,并且经过内部Valve的过滤。
- 请求流转到Context的pipeline组件中,并且经过内部的Valve的过滤。
- 请求流转到Wrapper的pipeline组件中,并且经过内部的Valve的过滤。
- Wrapper内部的WrapperValve创建FilterChain实例,调用指定的Servlet实例处理请求。
- 返回
门面模式
门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
Tomcat中门面模式的例子:
RequestFacade作为Request的门面,内部包含Request对象。
这样的例子有:
ResponseFacade作为Response的门面,内部包含Response对象。
StandardSessionFacade作为HttpSession的门面,内部包含HttpSession对象。
ApplicationContextFacade作为ApplicationContext的门面,内部包含ApplicaitonContext对象。
如Request源码:
1 | public class RequestFacade implements HttpServletRequest { |