Tomcat 系统架构与设计模式,第 2 部分设计模式分析


立面设计模式

门面设计模式在Tomcat的许多地方使用。此设计模式用于Request和Response对象包,Standard Wrapper到ServletConfig包,以及ApplicationContext到ServletContext包。

立面设计模式的原则

这种设计模式在很多场合都有使用。这个设计模型有什么作用?顾名思义,就像外交部一样,将东西打包成外墙,更容易与他人交流。

当大型系统中有多个子系统时,主要使用此设计模式。这些多个子系统必须相互通信,但每个子系统不能将其内部数据暴露给其他系统太多,否则不会暴露给其他系统。没有必要划分子系统。每个子系统都将设计一个外观,将所关注的数据封装到其他系统并通过此外观访问它。这就是立面设计模式的含义。

立面设计的示意图如下:

图1.立面示意图

客户只能访问Fa?ade中提供的数据是门面设计模式的关键。客户如何访问Fa?ade和子系统如何提供Fa?ade门面设计模式不是强制性的。

Tomcat的外观设计模式示例

Tomcat中的外观设计模式经常使用,因为Tomcat中有许多不同的组件,每个组件都必须相互交互,这是一种使用外观模式隔离数据的好方法。

以下是按要求使用的立面设计图案:

图2.请求外观设计模式类图

0×251d

从图中可以看出,httpRequestFacade类封装httpRequest接口以提供数据,通过httpRequestFacade访问的数据委托给httpRequest。通常,封装对象被设置为私有或受保护的访问修饰符,以防止fa?艾德。它是直接访问的。

观测器设计模式

此设计模式也是一种常见的设计方法,通常称为发布订阅模式,它是事件侦听器机制,通常在事件发生之前和之后触发一些操作。

观察者模式的原理

观察者模式原则也很简单,也就是说,当你做什么事情时,总会有人盯着你看。当你做一些有趣的事情时,它会跟随其他事情。但是盯着你的人必须去注册,否则你不能通知。观察者模式通常包含以下角色:

主题是一个抽象的主题:它负责管理所有观察者引用并定义主要事件操作。具体主题特定主题:它实现抽象主题的所有定义接口,并在所有观察者更改时通知他们。观察者观察者:用于监视主题更改的相应操作界面。

Tomcat的观察者模式示例

Tomcat中的Observer模式也在很多地方使用。控制组件生命周期的生命周期是此模式的体现,以及Servlet实例,会话管理,容器等的创建。让我们来看看Lifecycle的具体实现。

生命周期的观察者模式结构:

图3.生命周期的观察者模式结构

在上面的结构图中,LifecycleListener表示一个抽象观察器,它定义了一个lifecycleEvent方法,该方法是主题更改时要执行的方法。 ServerLifecycleListener表示一个具体的观察者,它实现LifecycleListener接口的方法,该接口是此特定观察者的特定实现。 Lifecycle接口表示一个抽象主题,用于定义管理观察者的方法及其执行的其他方法。 StandardServer表示实现抽象主题的所有方法的特定主题。在这里,Tomcat扩展了观察者并添加了两个类:LifecycleSupport,LifecycleEvent,它将观察者的功能扩展为辅助类。 LifecycleEvent可以定义事件类别,并且可以更灵活地处理不同的事件。 LifecycleSupport类将主题的管理委派给多个观察者。统一提取和实施此管理。如果稍后修改它,则只需修改LifecycleSupport类。您无需修改所有特定主题,因为所有特定主题都由观察者操作。 LifecycleSupport类的代理。这可以被认为是观察者模式的改进版本。

LifecycleSupport调用观察者的方法代码,如下所示:

清单1. LifecycleSupport中的fireLifecycleEvent方法

Public void fireLifecycleEvent(String type,Object data){

生命周期事件事件=新的生命周期事件(生命周期,类型,数据);

Lifecycle Listener感兴趣[]=null;

同步(听众){

感兴趣的=Lifecycle Listener [])听众。 clone();

}

For(int I=0; I< interest.length; I ++)

有兴趣[i]。生命周期事件(事件);

}

主题如何通知观察者?请查看以下代码:

清单2.容器中的Start方法

Public void start()抛出Lifecycle Exception {

FireLifecycle事件(BEFORE_START_EVENT,null);

FireLifecycle事件(START_EVENT,null);

Start=true;

同步(服务){

For(int I=0; I< services.length; I ++){

如果(services [i] instanceof Lifecycle)

((生命周期)服务[i])。start();

}

}

lifecycle.fireLifecycleEvent(AFTER_START_EVENT,null);

}

命令设计模式

将Tomcat,Connector和Container的两个核心组件与一对比较。男方要求被接受的请求是通过命令给女主人的。对应于Connector和Container,Connector还通过命令模式调用Container。

命令模式原理

命令模式的主要功能是封装命令,将发出命令的责任与执行命令的责任分开。它也是一个功能分工。不同的模块可以对同一命令做出不同的解释。

以下命令模式通常包含以下角色:

客户端:创建命令并决定接收者命令命令:命令接口定义一个抽象方法ConcreteCommand:具体命令,负责调用接收者的相应操作。 Invoker请求者:负责调用命令对象来执行请求Receiver Recipient:负责实现和执行一个请求

Tomcat中命令模式的示例

Tomcat中的命令模式反映在Connector和Container组件之间。作为一个应用服务器,Tomcat无疑会接受很多请求。如何分配和执行这些请求是必要的功能。

我们来看看Tomcat如何实现命令模式。以下是Tomcat命令模式的结构图:

图4. Tomcat命令模式的框图

Connector充当抽象请求者,HttpConnector充当具体请求者。 HttpProcessor作为命令。 Container是命令的抽象接收者,ContainerBase是具体的接收者。客户端是Application Server Server组件。服务器首先创建命令请求者HttpConnector对象,然后创建命令HttpProcessor命令对象。然后将命令对象传递给命令acceptor ContainerBase容器以处理该命令。该命令最终由Tomcat的Container执行。命令可以进入队列,Container可以以不同的方式处理请求,例如HTTP1.0协议和HTTP 1.1。

责任链模型

Tomcat中最容易找到的设计模式之一是责任链模型。这种设计模式也是Tomcat中Container设计的基础。整个容器通过链连接,该链始终将请求正确地传递给最终处理请求的链。 Servlet的。

责任链模型的原则

责任链模型意味着许多对象具有对每个对象的引用并形成链。请求在此链上传递,直到链上的对象处理请求,或者可以处理每个对象。请求并将其传递给下一个,直到处理完最终链中的每个对象。这允许将任何处理节点添加到链中而不影响客户端。

通常,责任链模型具有以下作用:

处理程序(抽象处理程序):定义处理请求的接口ConcreteHandler:处理请求的特定类,或将其传递给下一个主页

Tomcat中责任链模型的示例

这种设计模式几乎完全用于tomcat。 Tomcat的容器设置是责任链模式。从引擎到主机到上下文,直到Wrapper通过链传递请求。

Tomcat中责任链模型的类结构图如下:

图5. Tomcat责任链模型的框图

上图基本上描述了使用责任链模式的四个子容器的类结构图。相应的责任链模式的作用是,Container扮演抽象处理程序的角色,而特定的处理器由子容器如StandardEngine扮演。与标准责任链不同,此处介绍了管道和阀门接口。他们的角色是什么?

实际上,Pipeline和Valve扩展了该链的功能,允许链中的外部干预。 Pipeline是连接每个子容器的管道。传入的Request和Response对象就像在管道中流动的水一样,Valve是管道中的一个小洞,让您有机会触摸内部的水并做一些额外的事情。的东西。

为了防止水被抽出并且不会流入下一个容器,管的每一端总是有一个节点以确保它将流到下一个子容器,因此每个容器都有一个StandardXXXValve。只要它涉及这种链是处理流程,这是一个非常有价值的模型。