Tomcat 在实现一键式启停和组件的生命周期管理时,运用了OOP、组合模式、观察者模式、骨架抽象类和模板方法,实现了可扩展性和可重用性。

ContainerBase 基类

StandardEngine、StandardHost、StandardContext 和 StandardWrapper 是四个容器组件(接口)的具体实现类。
它们都是容器,都继承了 ContainerBase 抽象基类,而 ContainerBase 实现了 Container 接口,也继承了 LifecycleBase 类,它们的生命周期管理接口和功能接口是分开的,这也符合设计中接口分离的原则。

LifecycleBase 基类

Tomcat 定义一个基类 LifecycleBase 来实现 Lifecycle 接口,把一些公共的逻辑放到基类中去,比如生命状态的转变与维护、生命事件的触发以及监听器的添加和删除等,而子类就负责实现自己的初始化、启动和停止等方法。为了避免跟基类中的方法同名,我们把具体子类的实现方法改个名字,在后面加上 Internal,叫 initInternal、startInternal 等。我们再来看引入了基类 LifecycleBase 后的类图:

生命周期总览

image.png

设计思想

观察者模式
观察者模式使用的背景是:当一个事件发生后,需要执行一连串更新操作。
传统的实现方式是在事件响应代码里直接加更新逻辑。
这种方式是紧耦合的、侵入式的。并且更新逻辑加多了之后,代码会变得臃肿。
观察者模式实现了低耦合、非侵入式的通知与更新机制。

接口与抽象基类
有了接口,就要用类去实现接口。一般来说实现类不止一个,不同的类在实现接口时往往会有一些相同的逻辑,如果让各个子类都去实现一遍,就会有重复代码。那子类如何重用这部分逻辑呢?其实就是定义一个基类来实现共同的逻辑,然后让各个子类去继承它,就达到了重用的目的。

基类中往往会定义一些抽象方法,基类不会去实现这些方法,而是调用这些方法来实现骨架逻辑。
抽象方法是留给各个子类去实现的,并且子类必须实现,否则无法实例化。

模板设计模式
比如 LifecycleBase 基类实现了 Lifecycle 接口中所有的方法,还定义了相应的抽象方法交给具体子类去实现,这是典型的模板设计模式。

模板方法
模板方法在抽象基类中经常用到,用来实现通用逻辑。