粗浅看 Tomcat中设计模式分析

2024-08-26 20:18

本文主要是介绍粗浅看 Tomcat中设计模式分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

Tomcat 中运用的许多经典设计模式,如模版模式、工厂模式和单例模式等。通过学习它们的实践运用能给我们以后的程序设计起到一定的借鉴作用。

外观

外观设计模式在 Tomcat 中有多处使用,在 Request 和Response对象封装中、StandardWrapper到 ServletConfig封装中、ApplicationContext到 ServletContext封装中等都用到了这种设计模式。

原理

这么多场合都用到了这种设计模式,那这种设计模式究竟能有什 么作用呢?顾名思义,就是将一个东西封装成一个外观好与人家更容易进行交流,就像一个国家的外交部一样。

这种设计模式主要用在一个大的系统中有多个子系统组成时,这 多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。 每个子系统都会设计一个外观,把别的系统感兴趣的数据封装起来, 通过这个外观来进行访问。这就是外观设计模式存在的意义。

外观设计模式示意图如下:


Client只能访问到 Façade中提供的数据是外观设计模式的关键,至 于 Client如何访问 Façade和 Subsystem如何提供 Façade 外观设 计模式并没有规定死。

Tomcat中的demo

Tomcat 中外观设计模式使用的很多,因为 Tomcat 中有很多不同组件,每个组件要相互交互数据,用外观模式隔离数据是个很好的方法。

下面是 Request 上使用的外观设计模式:


从图中可以看出 HttpRequestFacade类封装了 HttpRequest 接口能 够提供数据,通过 HttpRequestFacade访问到的数据都被代理到 HttpRequest 中,通常被封装的对象都被设为 Private或者 Protected 访问修饰,以防止在 Façade 中被直接访问。

观察者

这种设计模式也是常用的设计方法通常也叫发布 -订阅模式,也 就是事件监听机制,通常在某个事件发生的前后会触发一些操作。

原理

观察者模式原理也很简单,就是你在做事的时候旁边总有一个人在盯着你,当你做的事情是它感兴趣的时候,它就会跟着做另外一 些事情。但是盯着你的人必须要到你那去登记,不然你无法通知它。 观察者模式通常包含下面这几个角色:

Subject 就是抽象主题:它负责管理所有观察者的引用,同时定义主要的事件操作。

ConcreteSubject 具体主题:它实现了抽象主题的所有定义的接口,当自己发生变 化时,会通知所有观察者。

Observer 观察者:监听主题发生变化相应的操作接口。

Tomcat中的demo

Tomcat 中观察者模式也有多处使用,前面讲的控制组件生命周期的 Lifecycle就是这种模式的体现,还有对 Servlet实例的创建、 Session的管理、Container等都是同样的原理。下面主要看一下 Lifecycle 的具体实现。

Lifecycle 的观察者模式结构图:


上面的结构图中,LifecycleListener代表的是抽象观察者,它定 义一个 lifecycleEvent方法,这个方法就是当主题变化时要执行的方 法。 ServerLifecycleListener代表的是具体的观察者,它实现了 LifecycleListener接口的方法,就是这个具体的观察者具体的实现方式。Lifecycle接口代表的是抽象主题,它定义了管理观察者的方法 和它要所做的其它方法。而 StandardServer代表的是具体主题,它 实现了抽象主题的所有方法。这里 Tomcat 对观察者做了扩展,增加了另外两个类:LifecycleSupport、LifecycleEvent,它们作为辅助类扩展了观察者的功能。LifecycleEvent使得可以定义事件类别,不 同的事件可区别处理,更加灵活。LifecycleSupport类代理了主题对 多观察者的管理,将这个管理抽出来统一实现,以后如果修改只要 修改 LifecycleSupport类就可以了,不需要去修改所有具体主题, 因为所有具体主题的对观察者的操作都被代理给 LifecycleSupport类了。这可以认为是观察者模式的改进版。

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

1. LifecycleSupport 中的 fireLifecycleEvent 方法

public void fireLifecycleEvent(String type, Object data) {LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);LifecycleListener interested[] = null;synchronized (listeners) {interested = (LifecycleListener[]) listeners.clone();}for (int i = 0; i < interested.length; i++)interested[i].lifecycleEvent(event);}

主题是怎么通知观察者呢?看下面代码:

 2. 容器中的 start 方法

public void start() throws LifecycleException {lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);lifecycle.fireLifecycleEvent(START_EVENT, null);started = true;synchronized (services) {for (int i = 0; i < services.length; i++) {if (services[i] instanceof Lifecycle)((Lifecycle) services[i]).start();}}lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);}

命令

前面把 Tomcat中两个核心组件 Connector和 Container,比作一对夫妻。男的将接受过来的请求以命令的方式交给女主人。对应 到 Connector和 Container,Connector也是通过命令模式调用 Container的。

原理

命令模式主要作用就是封装命令,把发出命令的责任和执行命令 的责任分开。也是一种功能的分工。不同的模块可以对同一个命令做出不同解释。 

下面是命令模式通常包含下面几个角色:

Client:创建一个命令,并决定接受者

Command 命令:命令接口定义一个抽象方法

ConcreteCommand:具体命令,负责调用接受者的相应操作

Invoker 请求者:负责调用命令对象执行请求

Receiver 接受者:负责具体实施和执行一次请求

Tomcat 中的demo

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

下面看一下 Tomcat 是如何实现命令模式的,下面是 Tomcat 命令 模式的结构图:


Connector 作为抽象请求者,HttpConnector作为具体请求者。 HttpProcessor作为命令。Container作为命令的抽象接受者, ContainerBase 作为具体的接受者。客户端就是应用服务器 Server组件了。Server 首先创建命令请求者HttpConnector对象,然后创建命令 HttpProcessor命令对象。再把命令对象交给命令接受者 ContainerBase 容器来处理命令。命令的最终是被 Tomcat 的 Container执行的。命令可以以队列的方式进来,Container也可以 以不同的方式来处理请求,如 HTTP1.0协议和 HTTP1.1的处理方 式就会不同。

职责链

Tomcat 中一个最容易发现的设计模式就是职责链模式,这个设 计模式也是Tomcat中 Container设计的基础,整个容器的就是通 过一个链连接在一起,这个链一直将请求正确的传递给最终处理请 求的那个 Servlet。

原理

职责链模式,就是很多对象有每个对象对其下家的引用而连接起 来形成一条链,请求在这条链上传递,直到链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给下一家,直到最终链 上每个对象都处理完。这样可以不影响客户端而能够在链上增加任 意的处理节点。

通常职责链模式包含下面几个角色:

Handler(抽象处理者):定义一个处理请求的接口

ConcreteHandler(具体处理者):处理请求的具体类,或者传给下家

Tomcat 中的demo

在tomcat中这种设计模式几乎被完整的使用,tomcat的容器设置就是职责链模式,从 Engine 到 Host再到 Context一直到 Wrapper 都是通过一个链传递请求。

Tomcat 中职责链模式的类结构图如下:



上图基本描述了四个子容器使用职责链模式的类结构图,对应的 职责链模式的角色,Container扮演抽象处理者角色,具体处理者由 StandardEngine等子容器扮演。与标准的职责链不同的是,这里引 入了 Pipeline和 Valve接口。他们有什么作用呢?

实际上 Pipeline和 Valve是扩展了这个链的功能,使得在链往下 传递过程中,能够接受外界的干预。Pipeline就是连接每个子容器 的管子,里面传递的 Request和 Response对象好比管子里流的水, 而 Valve就是这个管子上开的一个个小口子,让你有机会能够接触 到里面的水,做一些额外的事情。

为了防止水被引出来而不能流到下一个容器中,每一段管子最后 总有一个节点保证它一定能流到下一个子容器,所以每个容器都有一个StandardXXXValve。只要涉及到这种有链式是处理流程这是一个非常值得借鉴的模式。

业务思想

Tomcat中的设计模式很值得研究学习,免得绕路去上学,搞不好成绩还低呢。

不知道有朋友看过《射雕英雄传》木?其中一段是讲黄蓉受伤去拜见南帝段皇爷治疗,途遇老顽童的老婆瑛姑,二人在茅屋内做算术题,瑛姑是闭门造车,而黄蓉是看黄老邪(也就是他老爸收集的书本),最后结果相信大家都知道:瑛姑pk失败。原因值得探究:时刻要站在巨人的肩膀上来学习。

时刻要站在巨人的肩膀上来学习,稍微努力就可以超过巨人哦!给自己也给大家一点儿鼓励,相信自己可以做的更好,goon!


部分设计模式介绍:

大话设计模式:(序)

大话设计模式:(六大原则)

这篇关于粗浅看 Tomcat中设计模式分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109576

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

Tomcat性能参数设置

转自:http://blog.csdn.net/chinadeng/article/details/6591542 Tomcat性能参数设置 2010 - 12 - 27 Tomcat性能参数设置 博客分类: Java Linux Tomcat 网络应用 多线程 Socket 默认参数不适合生产环境使用,因此需要修改一些参数   1、修改启动时内存参数、并指定J

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。