欢迎来到天天文库
浏览记录
ID:40199752
大小:340.51 KB
页数:7页
时间:2019-07-25
《Tomcat 系统架构与设计模式之二》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Tomcat系统架构与设计模式之二门面设计模式门面设计模式在Tomcat中有多处使用,在Request和Response对象封装中、StandardWrapper到ServletConfig封装中、ApplicationContext到ServletContext封装中等都用到了这种设计模式。门面设计模式的原理这么多场合都用到了这种设计模式,那这种设计模式究竟能有什么作用呢?顾名思义,就是将一个东西封装成一个门面好与人家更容易进行交流,就像一个国家的外交部一样。这种设计模式主要用在一个大的系统中有多个子系统组成
2、时,这多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。每个子系统都会设计一个门面,把别的系统感兴趣的数据封装起来,通过这个门面来进行访问。这就是门面设计模式存在的意义。门面设计模式示意图如下:图1.门面示意图Client只能访问到Façade中提供的数据是门面设计模式的关键,至于Client如何访问Façade和Subsystem如何提供Façade门面设计模式并没有规定死。Tomcat的门面设计模式示例Tomcat中门面设计模式使用的很多,
3、因为Tomcat中有很多不同组件,每个组件要相互交互数据,用门面模式隔离数据是个很好的方法。下面是Request上使用的门面设计模式:图2.Request的门面设计模式类图从图中可以看出HttpRequestFacade类封装了HttpRequest接口能够提供数据,通过HttpRequestFacade访问到的数据都被代理到HttpRequest中,通常被封装的对象都被设为Private或者Protected访问修饰,以防止在Façade中被直接访问。观察者设计模式这种设计模式也是常用的设计方法通常也叫发布-
4、订阅模式,也就是事件监听机制,通常在某个事件发生的前后会触发一些操作。观察者模式的原理观察者模式原理也很简单,就是你在做事的时候旁边总有一个人在盯着你,当你做的事情是它感兴趣的时候,它就会跟着做另外一些事情。但是盯着你的人必须要到你那去登记,不然你无法通知它。观察者模式通常包含下面这几个角色:·Subject就是抽象主题:它负责管理所有观察者的引用,同时定义主要的事件操作。·ConcreteSubject具体主题:它实现了抽象主题的所有定义的接口,当自己发生变化时,会通知所有观察者。·Observer观察者:监
5、听主题发生变化相应的操作接口。Tomcat的观察者模式示例Tomcat中观察者模式也有多处使用,前面讲的控制组件生命周期的Lifecycle就是这种模式的体现,还有对Servlet实例的创建、Session的管理、Container等都是同样的原理。下面主要看一下Lifecycle的具体实现。Lifecycle的观察者模式结构图:图3.Lifecycle的观察者模式结构图上面的结构图中,LifecycleListener代表的是抽象观察者,它定义一个lifecycleEvent方法,这个方法就是当主题变化时要执
6、行的方法。ServerLifecycleListener代表的是具体的观察者,它实现了LifecycleListener接口的方法,就是这个具体的观察者具体的实现方式。Lifecycle接口代表的是抽象主题,它定义了管理观察者的方法和它要所做的其它方法。而StandardServer代表的是具体主题,它实现了抽象主题的所有方法。这里Tomcat对观察者做了扩展,增加了另外两个类:LifecycleSupport、LifecycleEvent,它们作为辅助类扩展了观察者的功能。LifecycleEvent使得可以
7、定义事件类别,不同的事件可区别处理,更加灵活。LifecycleSupport类代理了主题对多观察者的管理,新濠天地娱乐场66bb.org将这个管理抽出来统一实现,以后如果修改只要修改LifecycleSupport类就可以了,不需要去修改所有具体主题,因为所有具体主题的对观察者的操作都被代理给LifecycleSupport类了。这可以认为是观察者模式的改进版。LifecycleSupport调用观察者的方法代码如下:清单1.LifecycleSupport中的fireLifecycleEvent方法publ
8、icvoidfireLifecycleEvent(Stringtype,Objectdata){LifecycleEventevent=newLifecycleEvent(lifecycle,type,data);LifecycleListenerinterested[]=null;synchronized(listeners){interested=(LifecycleListene
此文档下载收益归作者所有