<table class=MsoTableGrid style="BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=0>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
解构Core J2EE Pattern ——GoF Design Pattern的自然延伸<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
</td></tr>
<tr style="mso-yfti-irow: 1">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
Core J2EE Patter是企业应用软件设计的神兵利器,已为广大J2EE开发者所使用。然而如此法宝也不是从天而降,GoF Design Pattern在他的诞生历程中可谓功不可没。以下的部分我将就GoF Design Pattern在Core J2EE Pattern中的应用和大家展开讨论,所给出的是未经过简化的类图,对于一些不同的理解和文字中的关键概念请参看参考文献中所列信息。
</td></tr>
<tr style="mso-yfti-irow: 2">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 3">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
表示层模式
</td></tr>
<tr style="mso-yfti-irow: 4">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
截取过滤链
</td></tr>
<tr style="mso-yfti-irow: 5">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
过滤链的目的是对消息进行筛选,最终将可用的消息交给消息的接受者。它以GoF Design Pattern中的Chain Of Responsibility为基础,是Chain If Responsibility的特例。
</td></tr>
<tr style="mso-yfti-irow: 6">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
</td></tr>
<tr style="mso-yfti-irow: 7">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
图表 1 ChainOfResponsibilty
</td></tr>
<tr style="mso-yfti-irow: 8">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 9">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
前端控制器
</td></tr>
<tr style="mso-yfti-irow: 10">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
前端控制器的目的是向客户端提供一个处理请求的最初联系点,也就是说为客户端提供一个与服务器交互的门户。这时的前端控制器是Façade的特例。
</td></tr>
<tr style="mso-yfti-irow: 11">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 12">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
图表 2 façade
</td></tr>
<tr style="mso-yfti-irow: 13">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
视图助手
</td></tr>
<tr style="mso-yfti-irow: 14">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
试图助手的目的可以理解为为视图添加额外的功能,比如数据消化、业务逻辑等。从这一目的出发,我们可以利用Decorator作为其骨架。
</td></tr>
<tr style="mso-yfti-irow: 15">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 16">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
图表 3 Decrator
</td></tr>
<tr style="mso-yfti-irow: 17">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 18">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
复合视图
</td></tr>
<tr style="mso-yfti-irow: 19">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
复合视图的目的是将复杂的试图理解为若干松偶合部分的集合。很明显,这是Composite模式在特定目的下的应用。
</td></tr>
<tr style="mso-yfti-irow: 20">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 21">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 22">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
图表 4Component表示下的复合视图模式
</td></tr>
<tr style="mso-yfti-irow: 23">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
工作者服务
</td></tr>
<tr style="mso-yfti-irow: 24">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
工作者服务描述了前端控制器、试图助手和分发者试图的结合,对外提供统一的接口。由此看来,工作者服务也是一个Façade模式。工作者服务是典型的复合模式,它所要包装的是前面提到的前端控制器、试图助手和分发者试图这三种模式。
</td></tr>
<tr style="mso-yfti-irow: 25">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 26">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 27">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
图表 5工作者服务
</td></tr>
<tr style="mso-yfti-irow: 28">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 29">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
分发者视图
</td></tr>
<tr style="mso-yfti-irow: 30">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
很难说分发者试图是那种设计模式的应用或哪几种模式的复合,但是我们可以借助Poxy模式来实现一个分发者视图。其设计思想是基于MVC的设计,通过定义消息和消息的映射解偶View和Control。
</td></tr>
<tr style="mso-yfti-irow: 31">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
</td></tr>
<tr style="mso-yfti-irow: 32">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
图表6 分发者试图
</td></tr>
<tr style="mso-yfti-irow: 33">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
参考文献
</td></tr>
<tr style="mso-yfti-irow: 34">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
《利用J2EE模式构建网站》李志 2003 年 7 月
</td></tr>
<tr style="mso-yfti-irow: 35">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
《spring的MVC和前端控制器》
</td></tr>
<tr style="mso-yfti-irow: 36">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
《J2EE核心模式》Deepak Alur、John Crupi、Dan Malks
</td></tr>
<tr style="mso-yfti-irow: 37; mso-yfti-lastrow: yes">
<td style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 516.75pt; PADDING-TOP: 0cm" vAlign=top width=689>
《设计模式——可复用面对对象软件的基础》Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
</td></tr>