﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-J2EE之巅-随笔分类-Design Pattern</title><link>http://www.blogjava.net/chaocai/category/8361.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 19 Aug 2010 03:24:39 GMT</lastBuildDate><pubDate>Thu, 19 Aug 2010 03:24:39 GMT</pubDate><ttl>60</ttl><item><title>弹性编程原则(1)</title><link>http://www.blogjava.net/chaocai/archive/2009/09/14/295064.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Mon, 14 Sep 2009 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2009/09/14/295064.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/295064.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2009/09/14/295064.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/295064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/295064.html</trackback:ping><description><![CDATA[<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1&nbsp;SRP</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">SRP(Single&nbsp;Responsible&nbsp;Principle),&nbsp;<font face="宋体">单一职责原则，这是面对的最基本原则，也是实现弹性设计的最基本原则。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">每个类或接口定义应该只包含一种明确的职责，同时仅有一种原因会导致这种定义的修改。一个复杂的类或接口的定义包含多个责任，很容易使你的设计失去弹性，很多因素都会导致这个类或接口的变更，由于它含有多种职责，这就意味着它是多种服务的提供者，会有多种依赖于它的客户类，他的变更可能会导致大范围的变更。</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">在作者看来，优先级最高的是你首先要保证接口的单一职责及方法的单一职责，接口通常意味可以更换不同的实现，为一个接口定义过多的职责意味着每个实现都会涉及多个职责，这将导致无法实现更小粒度的实现的复用。</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2&nbsp;<font face="宋体">面向抽象编成</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">如果你已经读过<font face="Times New Roman">GOF</font><font face="宋体">的《设计模式》，你便知道其中每一个模式都是基于此原则的，抽象（或接口）有效的解除了服务调用者和服务提供者间的耦合。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">3&nbsp;<font face="宋体">使用配置</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">通过修改配置文件便可以改变系统的某些特性，这种修改的区别于修改代码，对于<font face="Times New Roman">Java,C++</font><font face="宋体">而言这种修改是不需要编译，有的修改甚至可以在运行时生效。</font><font face="Times New Roman">DSL</font><font face="宋体">地运用可以使配置更加具有可读性及更强的描述能力。在设计时将实现分为配置及框架部分是非常灵活的结构。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<br />
<p>蔡超<br />
HP 软件架构师<br />
软件架构顾问<br />
SCEA<br />
IBM Certified Solution Designer for OOA&amp;D vUML2<br />
Chaocai2001@yahoo.com.cn</p>
<br />
<!--endfragment-->
<img src ="http://www.blogjava.net/chaocai/aggbug/295064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2009-09-14 20:28 <a href="http://www.blogjava.net/chaocai/archive/2009/09/14/295064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读书笔记：额外的间接层(Beautiful Code)</title><link>http://www.blogjava.net/chaocai/archive/2009/05/19/271596.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Tue, 19 May 2009 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2009/05/19/271596.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/271596.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2009/05/19/271596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/271596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/271596.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p><span style="font-family: 宋体">在</span>OO<span style="font-family: 宋体">中可以使用抽象方法及接口来完成文中通过函数指针和结构体来实现的间接层。<br />
</span></p>
<p><img height="289" alt="" src="http://www.blogjava.net/images/blogjava_net/chaocai/proxy.jpg" width="279" border="0" /><br />
Client.java</p>
<p>AppInterface app=new AppImpl();</p>
<p>AppInterface app1=new AppProxy(app);</p>
<p>AppProxy.java</p>
<p>public class AppProxy implements AppInterface{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private AppInterface appRef;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public AppProxy(AppInterface appRef){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.appRef=appRef</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 36pt">public void doSomething(){</p>
<p style="margin-left: 36pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*some codes*/</p>
<p style="margin-left: 36pt">}</p>
<p>}</p>
<p><span style="font-family: 宋体">通过</span>Proxy<span style="font-family: 宋体">来实现间接层，相互嵌套可以实现多个间接层，并且可以通过一个</span>AppBuilder<span style="font-family: 宋体">来创建这个对象，组合多个间接层。间接层中可以实现文中提及的对参数的预处理。</span></p>
<p><span style="font-family: 宋体">同时，我也认为文中提及的间接层也可以是</span>Adapter<span style="font-family: 宋体">。</span></p>
<p></p>
<img src ="http://www.blogjava.net/chaocai/aggbug/271596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2009-05-19 21:45 <a href="http://www.blogjava.net/chaocai/archive/2009/05/19/271596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Double Dispatch模式</title><link>http://www.blogjava.net/chaocai/archive/2009/02/19/255640.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Thu, 19 Feb 2009 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2009/02/19/255640.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/255640.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2009/02/19/255640.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/255640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/255640.html</trackback:ping><description><![CDATA[<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">本文介绍了常见面向对象语言（Java,C#等）OverLoad对于运行时执行的方法邦定的局限，并且如何通过Double&nbsp;Dispatch来实现运行时行为邦定。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">1&nbsp;<font face="宋体">根据对象来选择行为问题</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;interface&nbsp;Event&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;BlueEvent&nbsp;implements&nbsp;Event&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;RedEvent&nbsp;implements&nbsp;Event&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;Handler&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;handle(Event&nbsp;event){</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">System.out.println("It&nbsp;is&nbsp;event");</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;handle(RedEvent&nbsp;event){</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">System.out.println("It&nbsp;is&nbsp;RedEvent");</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;handle(BlueEvent&nbsp;event){</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">System.out.println("It&nbsp;is&nbsp;BlueEvent");</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;Main&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"> </span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">Event&nbsp;evt=new&nbsp;BlueEvent();</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">new&nbsp;Handler().handle(evt);</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">你认为运行结果是什么呢？</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">结果：</font></span><span style="font-size: 10.5pt; color: #000000; font-family: 'Courier New';">It&nbsp;is&nbsp;event</span><span style="font-size: 10.5pt; color: #000000; font-family: 'Courier New';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; color: #000000; font-family: 'Courier New';">是不是有点出乎意料，不是</span><span style="font-size: 10.5pt; font-family: '宋体';">It&nbsp;is&nbsp;BlueEvent<font face="宋体">，这是应为Overload并不支持在运行时根据参数的运行时类型来帮定方法，所以要执行哪个方法是在编译时就选定了的。</font></span><span style="font-size: 10.5pt; color: #000000; font-family: 'Courier New';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">2&nbsp;Double&nbsp;Dispatch&nbsp;Pattern</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">由于Java,C++及C#都具有上述局限，通常我们只能通过Switch或if结构来实现，当然这种实现方式既不优雅而且影响代码的可维护性。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">通过以下的Double&nbsp;Dispatch&nbsp;Pattern便可以优雅的实现。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;interface&nbsp;Event&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;injectHandler(EventHandler&nbsp;v);</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;BlueEvent&nbsp;implements&nbsp;Event&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;injectHandler(EventHandler&nbsp;v)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"> </span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">v.handle(this);</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;RedEvent&nbsp;implements&nbsp;Event&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;injectHandler(EventHandler&nbsp;v)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">v.handle(this);</span><span style="font-size: 10.5pt; font-family: '宋体';"> </span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"> </span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;EventHandler&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;handle(BlueEvent&nbsp;e){</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">System.out.println("It&nbsp;is&nbsp;BlueEvent");</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;void&nbsp;handle(RedEvent&nbsp;e){</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">System.out.println("It&nbsp;is&nbsp;RedEvent");</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;class&nbsp;Main&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">Event&nbsp;evt=new&nbsp;BlueEvent();</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">evt.injectHandler(new&nbsp;EventHandler());</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">}</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">其实设计模式（GoF)中的Visitor模式就是Double&nbsp;Dispatch的一种应用。<br />
<br />
<br />
蔡超<br />
HP
软件架构师<br />
软件架构顾问<br />
SCEA,SCBCD,MCSD<br />
IBM Certified Solution Designer for
OOA&amp;D vUML2<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#67;&#104;&#97;&#111;&#99;&#97;&#105;&#50;&#48;&#48;&#49;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;&#44;&#99;&#104;&#97;&#111;&#46;&#99;&#97;&#105;&#64;&#104;&#112;&#46;&#99;&#111;&#109;">Chaocai2001@yahoo.com.cn,chao.cai@hp.com</a>
</font></span></p>
<img src ="http://www.blogjava.net/chaocai/aggbug/255640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2009-02-19 21:02 <a href="http://www.blogjava.net/chaocai/archive/2009/02/19/255640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi实现动态特性的关键模式</title><link>http://www.blogjava.net/chaocai/archive/2008/10/15/234529.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Wed, 15 Oct 2008 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2008/10/15/234529.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/234529.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2008/10/15/234529.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/234529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/234529.html</trackback:ping><description><![CDATA[OSGi平台为我们提供了强大的动态特性，通过分析我们可以发现这些动态特性的实现与很多常用的设计模式相关，了解其中原理直接将这些模式用于我们的应用开发，也可以有效地实现动态特性。<br />
1 Broker模式：实现服务提供者与服务使用者的分离及解耦。Bundle通过所能提供的服务将自己注册至Framework，调用者通过Framework查找所需的服务。Bundle的服务注册是实现服务自动发现的基础。<br />
&nbsp;<img alt="" src="http://www.blogjava.net/images/blogjava_net/chaocai/broker.JPG" border="0" /><br />
2 监听者模式：这是实现动态特性的关键，通过监听者模式服务的使用者(实现监听接口)可以获得所依赖的服务提供者（Bundle）的状态变化的通知，从而动态处理与服务提供者间的关系以实现动态特性，不仅如此OSGi Framework自身同样有效的融合了这种通知机制，使得实现监听者接口的Bundle可以了解Framework的状态变化。<br />
&nbsp;<img alt="" src="http://www.blogjava.net/images/blogjava_net/chaocai/observer.JPG" border="0" /><br />
在我们的应用系统中借鉴OSGi的原理，同样可以有效地实现动态特性。<br />
<br />
<br />
蔡超<br />
软件架构师<br />
软件架构顾问<br />
SCEA,SCBCD<br />
IBM Certified Solution Designer for OOA&amp;D vUML2<br />
Chaocai2001@yahoo.com.cn
<img src ="http://www.blogjava.net/chaocai/aggbug/234529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2008-10-15 21:40 <a href="http://www.blogjava.net/chaocai/archive/2008/10/15/234529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DAO模式最佳实践</title><link>http://www.blogjava.net/chaocai/archive/2008/06/25/210685.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Wed, 25 Jun 2008 13:49:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2008/06/25/210685.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/210685.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2008/06/25/210685.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/210685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/210685.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
DAO看似是一个非常简单的模式，但这个模式却十分重要，它可以帮助我们实现持久化逻辑和业务逻辑的分离；它可以帮助我们实现对多种持久化实现的支持。<br />
同时，DAO模式并没有看起来这么简单，要真正发挥它的威力需注意的方面很多，而这些方面常常被大家忽略，以下是本人总结的一些最佳实践。<br />
1 不要在DAO上控制事务的边界<br />
应该在Fa&#231;ade层控制事务的边界，这样可以提高DAO的复用性，使它适用于不同的事务策略。<br />
2 不要过分使用Checked Exception<br />
开发者常常会将DAO中的各种异常通通捕捉并通过Checked Exception抛出，其实这是中不好的习惯，因为DAO中发生的异常常常是不可恢复的（如：数据库连接问题等），既然如此就应该使用RuntimeException异常抛出，使用这种异常还有一个好处就是在CMP的情况下可以自动引发事务的回滚。<br />
3 不要在DAO中处理懒加载问题<br />
使用Hibernate就会经常遇到懒加载问题，但是这个问题不应该在DAO中解决，这样会影响DAO的复用性，应为要加载那些对象域往往是和界面相关的，这个问题应该在Fa&#231;ade层中解决，应为这是离表现层较近的一层。<br />
&nbsp;<br />
<br />
http://dev2dev.bea.com.cn/blog/chaocai/200806/dao_24_1070.html<br />
&nbsp;<br />
蔡超<br />
软件架构师<br />
软件架构顾问<br />
SCEA<br />
IBM Certified Solution Designer for OOA&amp;D vUML2<br />
Chaocai2001@yahoo.com.cn<br />
<img src ="http://www.blogjava.net/chaocai/aggbug/210685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2008-06-25 21:49 <a href="http://www.blogjava.net/chaocai/archive/2008/06/25/210685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现IoC,AOP容器  源码下载</title><link>http://www.blogjava.net/chaocai/archive/2008/05/27/203261.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Tue, 27 May 2008 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2008/05/27/203261.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/203261.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2008/05/27/203261.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/203261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/203261.html</trackback:ping><description><![CDATA[上一篇相关内容<br />
http://www.blogjava.net/chaocai/archive/2008/05/26/203020.html<br />
源码下载<br />
http://www.blogjava.net/Files/chaocai/mini-container-beta0.9-src.rar<br />
希望对大家有帮z，也期待大家的反馈！ 
<img src ="http://www.blogjava.net/chaocai/aggbug/203261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2008-05-27 16:54 <a href="http://www.blogjava.net/chaocai/archive/2008/05/27/203261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现IoC,AOP容器</title><link>http://www.blogjava.net/chaocai/archive/2008/05/26/203020.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Mon, 26 May 2008 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2008/05/26/203020.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/203020.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2008/05/26/203020.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/203020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/203020.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Mini-Container 开发者手册(Mini-Container Beta 0.9,下载地址：http://www.blogjava.net/Files/chaocai/mini-container-beta-0.9.rar)蔡超软件架构师软件架构咨询顾问Chaocai2001@yahoo.com.cn序Mini-Container...&nbsp;&nbsp;<a href='http://www.blogjava.net/chaocai/archive/2008/05/26/203020.html'>阅读全文</a><img src ="http://www.blogjava.net/chaocai/aggbug/203020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2008-05-26 20:21 <a href="http://www.blogjava.net/chaocai/archive/2008/05/26/203020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>过细粒度的Bundle是成功实现OSGi应用的大敌</title><link>http://www.blogjava.net/chaocai/archive/2008/04/15/193219.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Tue, 15 Apr 2008 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2008/04/15/193219.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/193219.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2008/04/15/193219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/193219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/193219.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">近期做了几个使用</span>OSGi<span style="font-family: 宋体">开发的应用，发现使用过细粒度的</span>Bundle<span style="font-family: 宋体">不会给项目带来任何好处，而很多设计人员实际都会在使用</span>OSGi<span style="font-family: 宋体">平台时陷入这个陷阱。</span></p>
<p><span style="font-family: 宋体">首先我们分析</span>OSGi<span style="font-family: 宋体">的特点及可以给我们应用带来的好处</span></p>
<p>1 <span style="font-family: 宋体">良好的动态特性</span></p>
<p>2 <span style="font-family: 宋体">更细粒度的类装载控制，多个版本组件在同一运行环境中共同运行</span></p>
<p>3 <span style="font-family: 宋体">在</span>JVM<span style="font-family: 宋体">内部实现</span>SOA<span style="font-family: 宋体">（我个人倒是认为</span>OSGi<span style="font-family: 宋体">所涉及的仅仅是</span>SOA<span style="font-family: 宋体">思想的一小部分）</span></p>
<p>4 DS<span style="font-family: 宋体">提供的</span>IoC<span style="font-family: 宋体">支持</span></p>
<p><span style="font-family: 宋体">请思考你的应用程序真的需要这些吗？</span></p>
<p><span style="font-family: 宋体">很多设计和开发人员都会在设计和实现时忽略应用的真正需要和</span>OSGi<span style="font-family: 宋体">的复杂性，将应用的所有内部细小划分都采用</span>Bundle<span style="font-family: 宋体">实现。</span></p>
<p><span style="font-family: 宋体">而我们除了应该注意采用</span>OSGi<span style="font-family: 宋体">开发和调试带来的复杂性；同时也要明白动态特性的支持并不是仅仅采用</span>OSGi<span style="font-family: 宋体">平台就可以搞定的，要真正实现动态特性必须注意模块的启动顺序无关性及对其所依赖服务的监听等，这些都会大大增加系统实现和调试的复杂性。</span></p>
<p><span style="font-family: 宋体">其实我们应该认真分析应用是否需要这些</span>OSGi<span style="font-family: 宋体">的特性及这些特性应该在应用的那些部分体现，例如我们可以在扩展方面采用</span>Bundle<span style="font-family: 宋体">实现扩展插件，至于其它部分则不必采用过多的</span>Bundles<span style="font-family: 宋体">（甚至可以采用一个大的</span>Bundle<span style="font-family: 宋体">，而其内部则可以采用如</span>Spring<span style="font-family: 宋体">来帮助我们实现模块化）。</span></p>
<p><span style="font-family: 宋体">同时，不要忘记其他的</span>framework<span style="font-family: 宋体">同样提供了很好的组件化的基础架构如</span>Spring<span style="font-family: 宋体">，</span>Pico-Container<span style="font-family: 宋体">，在</span>OSGi<span style="font-family: 宋体">与其它技术混合时</span>SCA<span style="font-family: 宋体">同样是很好的选择。</span></p>
<p><span style="font-family: 宋体">保持应用的简单性，不要针对特定技术进行设计，而要为设计选择适合的技术。</span></p>
<p style="background: white; line-height: 200%"><span style="font-size: 10.5pt; line-height: 200%">蔡超<br />
</span><span style="font-size: 10.5pt; line-height: 200%; font-family: 'MS Shell Dlg'">Chaocai2001@yahoo.com.cn</span></p>
<span style="font-size: 10.5pt; font-family: 'MS Shell Dlg'">JEE</span><span style="font-size: 10.5pt; font-family: 宋体">咨询顾问</span><span style="font-size: 10.5pt; font-family: 'MS Shell Dlg'"><br clear="all" />
SCEA(1.2&amp;5)<br clear="all" />
IBM Certified OOA&amp;D Solution Designer vUML2</span>
<img src ="http://www.blogjava.net/chaocai/aggbug/193219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2008-04-15 21:43 <a href="http://www.blogjava.net/chaocai/archive/2008/04/15/193219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分层模式中的常见问题</title><link>http://www.blogjava.net/chaocai/archive/2008/03/19/187361.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Wed, 19 Mar 2008 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2008/03/19/187361.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/187361.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2008/03/19/187361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/187361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/187361.html</trackback:ping><description><![CDATA[<div id="div_content">
<div style="margin: 17pt 0cm 16.5pt"><strong><font size="6">引言</font></strong></div>
<div>分层结构是目前复杂应用系统开发时普遍使用的模式，软件中层之间的依赖关系约束是比较宽松的，并不要求上层仅可以依赖于直接下层，而是上层可以依赖于它的所有下层。</div>
<div>设计中我们会把各种系统的各种组件映射至不同层中，而在我所接触的一些实际项目中设计人员在映射这种组件和层间的关系时经常无意中破坏了层结构的依赖关系约束。</div>
<div align="center">
<p>&nbsp;</p>
<p><font size="2"><a href="http://dev2dev.bea.com.cn/blog/chaocai/uploadfiles/2008/03/16/486.jpg" target="_blank"><img alt="" src="http://dev2dev.bea.com.cn/blog/chaocai/uploadfiles/2008/03/16/486.jpg" border="0" /></a></font></p>
<p><font size="2">图表 <span>1</span> 典型分层结构</font></p>
</div>
<div style="margin: 17pt 0cm 16.5pt"><strong><font size="6">设计中的常见问题</font></strong></div>
<div style="margin: 13pt 0cm"><strong><font size="5">问题一:数据传输对象（DTO）是否应该属于业务层？</font></strong></div>
<div>在J2EE开发的经典著作《Core J2EE Patterns》中数据传输对象被划分在业务层模式中，那么是否数据传输对象应该被映射到业务层呢？</div>
<div>数据访问对象（DAO）在该著作中是被映射到整合层的，这样就会出现一个违反层依赖约束的问题，因为数据访问对象是要依赖于数据传输对象的，因此下层就会出现对上层的依赖了。</div>
<div>所以本人认为DTO是在各层中传输数据的，我们可以不必强求的把他们映射到上述层次中，可以把他们放置在一个公共包中。</div>
<div>&nbsp;</div>
<div style="margin: 13pt 0cm"><strong><font size="5">问题二:使用POJO作业务对象的轻量级架构与上述层模型的映射</font></strong></div>
<div>在使用POJO的轻量级结构中我们通常会使用持久化框架（如Hibernate/JPA）同时会在架构中引入仓库对象(Repository Object)，负责业务对象的获取和保存。（注意：他的功能和DAO是有区别的，仓库对象中通常只应包括业务对象的获取和保存逻辑）。</div>
<div>通常设计人员会把业务对象映射至业务层，而将仓库对象映射至整合层。由于仓库对象对于业务对象的依赖关系就会破坏依赖关系约束，所以这种映射方式显然不正确。</div>
<div>下图是作者推荐的映射方式</div>
<div align="center">
<p>&nbsp;</p>
<p><font size="2"><a href="http://dev2dev.bea.com.cn/blog/chaocai/uploadfiles/2008/03/16/487.jpg" target="_blank"><img alt="" src="http://dev2dev.bea.com.cn/blog/chaocai/uploadfiles/2008/03/16/487.jpg" border="0" /></a></font></p>
<p><font size="2">图表 <span>2</span> 轻量级架构参考模型</font></p>
</div>
<div>&nbsp;</div>
<div>可以看到业务对象和仓库对象都被映射至业务层，而持久化框架被映射到了整合层。</div>
<div>&nbsp;</div>
<div style="margin: 17pt 0cm 16.5pt"><strong><font size="6">总结</font></strong></div>
<p><span style="font-size: 10.5pt">因此大家在设计过程中不要仅仅将分层结构留于形式，而要时刻注意设计是否符合这种架构模式，这样才能真正发挥这种架构模式的优势。</span></p>
<p><span style="font-size: 10.5pt"><span style="font-size: 10.5pt">&nbsp;</span></span></p>
<div>蔡超<br />
<a herf="http://dev2dev.bea.com.cn/blog/chaocai/200803/architecture_16_942.html">http://dev2dev.bea.com.cn/blog/chaocai/200803/architecture_16_942.html</a><br />
</div>
<div>JavaEE 咨询顾问</div>
<div>SCEA (1.2&amp;5.0)</div>
<div>IBM Certified Solution Designer for OOA&amp;D UML2</div>
</div>
<img src ="http://www.blogjava.net/chaocai/aggbug/187361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2008-03-19 21:48 <a href="http://www.blogjava.net/chaocai/archive/2008/03/19/187361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>黑板模式的常见实现方式 </title><link>http://www.blogjava.net/chaocai/archive/2007/11/07/158712.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Wed, 07 Nov 2007 00:57:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2007/11/07/158712.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/158712.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2007/11/07/158712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/158712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/158712.html</trackback:ping><description><![CDATA[http://dev2dev.bea.com.cn/blog/chaocai/200711/06_623.html
<img src ="http://www.blogjava.net/chaocai/aggbug/158712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2007-11-07 08:57 <a href="http://www.blogjava.net/chaocai/archive/2007/11/07/158712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring构建应用系统的最佳架构与模式实践（2）</title><link>http://www.blogjava.net/chaocai/archive/2007/06/08/122789.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Fri, 08 Jun 2007 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2007/06/08/122789.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/122789.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2007/06/08/122789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/122789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/122789.html</trackback:ping><description><![CDATA[蔡 超<br>SCEA，SCBCD，MCSD，IBM RUP Specilist<br>北京天融信软件架构师<br>SUN,Microsoft培训中心特邀高端教师<br>常年提供架构咨询服务<br>chaocai2001@yahoo.com.cn ，010-82776427<br><br>问题：<br>在spring+hibernate的常见架构中，常会应为hibernate的延迟加载遇到一些麻烦。如Hibernate的引入使用脱管领域对象直接取代了DTO,然而前台组织显示时常会应为脱管领域对象的一些关系域未被加载而抛出异常（其实延迟加载是优化系统性能的一种有效方式）。<br>为了使显示层正常工作，我们就必须在业务层显式的加载这些表现层会用到的延迟加载的关系域对象。而这样的工作不仅需要额外的代码，并且这些代码往往也与所进行的业务逻辑无关。并且表现层的变化较多这样一来如果上述代码进入业务层就会导致业务层跟随表现层的变化。<br>解决方案：<br>在&#8220;Spring构建应用系统的最佳架构与模式实践（1）&#8221;中将逻辑层分为了Fa&amp;ccedil;ade和ApplicationService两层。<br>Fa&amp;ccedil;ade的方法组织是针对客户端请求的，所以如果我们把业务逻辑封装在ApplicationService对象中，而把脱管对象产生（包括根据表现层初始化延迟加载对象，关闭Session）。这样便可以有效的防止表现层逻辑混入业务逻辑中。<br>
<img src ="http://www.blogjava.net/chaocai/aggbug/122789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2007-06-08 10:48 <a href="http://www.blogjava.net/chaocai/archive/2007/06/08/122789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring构建应用系统的最佳架构与模式实践（1） </title><link>http://www.blogjava.net/chaocai/archive/2007/05/08/115937.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Tue, 08 May 2007 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2007/05/08/115937.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/115937.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2007/05/08/115937.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/115937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/115937.html</trackback:ping><description><![CDATA[蔡 超<br>SCEA，SCBCD，MCSD，IBM RUP Specilist<br>北京天融信软件架构师<br>SUN,Microsoft培训中心特邀高端教师<br>常年提供架构咨询服务<br>chaocai2001@yahoo.com.cn ，010-82776427<br><br>引言<br>在使用Spring构建应用时和采用EJB构建应用一样同样也存在不少常用模式和最佳实践，当然很多Core J2EE Pattern仍然是我们构建spring应用中的优秀模式，不过有的也不再适用了（如：IoC的应用使得Service Locator不再适用，Hibernate取代Entity Bean使得DTO不再适用等）。<br>下文是一些在以Spring为核心的架构中的常见模式和架构最佳实践。<br><br><img style="WIDTH: 400px; CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://dev2dev.bea.com.cn/bbs/uploadimages/20075/200757143452305420.JPG" onload="javascript:if(this.width>400)this.style.width=400;"><br></img><br><br>图表 1 Spring应用常见架构模式列表<br>DAO模式<br>虽然采用了诸如Hibernate这样的O/R Mapping工具或是iBates这样的SQL Mapping工具但是采用DAO模式仍有相当好处。<br>在实际应用中我们常会遇到如下问题：<br>1 性能问题：由于性能问题我们可能要改变数据访问方式，如采用JDBC替换Hibernate这时，这时如果采用了DAO模式，数据访问被有效的封装和业务逻辑完全分离，易于实现替换。<br>2 移植问题：需要支持多种数据库，DAO模式仍然是一种稳妥的选择。虽然诸如Hibernate及iBates也提供很好的数据库无关性，但如果使用某些数据库的特殊功能时，就会出现问题。<br>当然，对于是否采用DAO模式也不可一概而论，应为他毕竟会增加应用的开发复杂性。个人认为很关键的一个判定条件是业务逻辑是否会和持久化逻辑混合。<br><br>Application Service模式<br>封装一定的业务逻辑和功能，提高复用性，即防止Fa&amp;ccedil;ade和业务对象的臃肿。注意在此可以应用Command模式及Strategy模式提供系统可维护性和可扩展性。<br>这个模式很重要，但常常被大家忽略，这时应为我们常会把逻辑放在Fa&amp;ccedil;ade中，其实这是很错误的。例如：我们可能会提供多种不同Fa&amp;ccedil;ade以适应不同的访问方式，这样就会出现大量重复的业务逻辑代码。<br><br>Fa&amp;ccedil;ade模式<br>为客户端提供访问业务组件的统一模式。便于实现对不同访问方式的支持（如：远程或本地）。特别在远程调用时通过暴露粗粒度的接口，提高系统的性能。<br>同时，可以根据客户的不同，通过不同Fa&amp;ccedil;ade来控制客户的操作。
<img src ="http://www.blogjava.net/chaocai/aggbug/115937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2007-05-08 14:25 <a href="http://www.blogjava.net/chaocai/archive/2007/05/08/115937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同步代理模式 Synchronization Proxy Pattern</title><link>http://www.blogjava.net/chaocai/archive/2006/11/10/80452.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Fri, 10 Nov 2006 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2006/11/10/80452.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/80452.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2006/11/10/80452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/80452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/80452.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式发现者</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt">:</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">蔡超</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">北京天融信，软件架构师</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US" style="FONT-SIZE: 9pt">SUN certified Enterprise Architect<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US" style="FONT-SIZE: 9pt">Microsoft certified Solution Developer<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US" style="FONT-SIZE: 9pt">IBM certified RUP Specialist<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">联系方式</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt">:cai_chao@topsec.com.cn,chaocai2001@yahoo.com.cn<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US" style="FONT-SIZE: 9pt">010-82776427<o:p></o:p></span>
		</p>
		<h1 style="MARGIN: 17pt 0cm 16.5pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语境</span>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在基于异步通信方式的系统中，实现模块的同步调用。</span>
		</p>
		<h1 style="MARGIN: 17pt 0cm 16.5pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">问题</span>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">消息队列已经成为目前很多软件选用的通讯方式，消息模式使得不同分布式组件间的耦合性较为松散，提高了系统的可维护性和可扩充性。但是有时我们希望在这种情况下能够模拟同步的调用方式，希望能够通过一个组件透明的帮我们实现这种异步和同步调用的转换。</span>
		</p>
		<h1 style="MARGIN: 17pt 0cm 16.5pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解决方案</span>
		</h1>
		<p class="MsoCaption" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<font size="2">
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">
								<img height="228" alt="p1.jpg" src="http://www.blogjava.net/images/blogjava_net/chaocai/p1.jpg" width="606" border="0" />
								<br />图表</span>
						<font face="Arial">
								<span lang="EN-US">
										<span style="mso-no-proof: yes">1</span>
								</span>
								<span lang="EN-US">
								</span>
						</font>
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">基于消息的分布式系统</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上图是一种常见的基于消息的分布系统结构，系统中包含两条队列。命令队列用于传送模块间相互调用的命令对象，响应队列用于传送命令处理后的响应结果对象。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在通常情况下消息队列上的模块会以异步的方式工作，这种情况下模块通常不关心命令执行后的状况，常常是不须返回值的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了模拟同步调用我们通过一个</span>
				<span lang="EN-US">SynProxy</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件来帮助我们完成由异步到同步调用的模拟。使得</span>
				<span lang="EN-US">Client</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对其他模块的调好像是同步的一样。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">SynProxy</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件的结构如下：</span>
		</p>
		<p class="MsoCaption" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US">
				</span>
				<font size="2">
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">
								<img height="388" alt="p2.jpg" src="http://www.blogjava.net/images/blogjava_net/chaocai/p2.jpg" width="700" border="0" />
								<br />图表</span>
						<font face="Arial">
								<span lang="EN-US">
										<span style="mso-no-proof: yes">2</span>
								</span>
								<span lang="EN-US"> SynProxy</span>
						</font>
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的静态结构</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">SynProxy:</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组织完成异步到同步调用的转换</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">WaitingQueue:</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存放还未获得执行返回值的</span>
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">UIDCreator:</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生能够唯一标示每个</span>
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的</span>
				<span lang="EN-US">UID</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">ResponseReceiver:</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">监听响应队列中的响应消息，它在独立的线程中运行</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：命令对象</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Response</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：响应对象<img height="769" alt="p3.jpg" src="http://www.blogjava.net/images/blogjava_net/chaocai/p3.jpg" width="860" border="0" /></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoCaption" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<font size="2">
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">图表</span>
						<font face="Arial">
								<span lang="EN-US">
										<span style="mso-no-proof: yes">3</span>
								</span>
								<span lang="EN-US">
								</span>
						</font>
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">将异同步调用转化成同步调用的过程</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分解释：</span>
				<span lang="EN-US">(</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上以在</span>
				<span lang="EN-US">JAVA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中为例</span>
				<span lang="EN-US">)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Wait</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示调用</span>
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">wait</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法阻塞住当前线程</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行模块在执行了响应操作后生产</span>
				<span lang="EN-US">Response</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象用于放回结果，</span>
				<span lang="EN-US">Response</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象中的</span>
				<span lang="EN-US">UID</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性应该与处理的</span>
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">UID</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的值相同</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Notify</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示调用</span>
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">notify</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法唤醒被阻塞的线程</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面过程中的</span>
				<span lang="EN-US">wait</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置了阻塞的超时时间（来自于</span>
				<span lang="EN-US">Command</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的属性值）</span>
		</p>
<img src ="http://www.blogjava.net/chaocai/aggbug/80452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2006-11-10 17:28 <a href="http://www.blogjava.net/chaocai/archive/2006/11/10/80452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>现代架构设计文档的编写</title><link>http://www.blogjava.net/chaocai/archive/2006/09/23/71455.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Sat, 23 Sep 2006 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2006/09/23/71455.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/71455.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2006/09/23/71455.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/71455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/71455.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">蔡</span>
				<span style="mso-bidi-font-size: 10.5pt">
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">超</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">SCEA</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">SCBCD</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">MCSD<br />北京天融信软件架构师<br /> SUN,Microsoft培训中心特邀高端教师<br /><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<br />常年提供架构咨询服务</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">chaocai2001@yahoo.com.cn </span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">010-82776427<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h1 style="MARGIN: 17pt 0cm 16.5pt">
				<span lang="EN-US">4+1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图与</span>
				<span lang="EN-US">UML</span>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">软件架构设计已经逐渐成为现代软件开发过程的核心，然而能够清晰表明架构设计并不是一件容易的事，就面向对象开发而言，</span>
				<span lang="EN-US">RUP </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">4+1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图已在架构设计的撰写中得到了广泛的应用和认可。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于</span>
				<span lang="EN-US">4+1 view</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的描述有几个不同版本（或包含的视图不同，或视图的名称不同），文中以</span>
				<span lang="EN-US">Philippe Kruchten, November 1995</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提出的</span>
				<span lang="EN-US">4+1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图为准。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">4+1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图包括：逻辑视图（</span>
				<span lang="EN-US">Logic View</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），开发视图（</span>
				<span lang="EN-US">Develop View</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），进程视图（</span>
				<span lang="EN-US">Process View</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），物理视图（</span>
				<span lang="EN-US">Physical View</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）和场景视图（</span>
				<span lang="EN-US">Scenarios</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US">
						<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
						<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
								</v:path>
								<o:lock v:ext="edit" aspectratio="t">
								</o:lock>
						</v:shapetype>
						<v:shape id="_x0000_i1025" style="WIDTH: 225pt; HEIGHT: 163.5pt" type="#_x0000_t75">
								<v:imagedata o:title="" src="file:///C:\DOCUME~1\CHAOCA~1.BIL\LOCALS~1\Temp\msohtml1\07\clip_image001.png">
										<img style="WIDTH: 418px; HEIGHT: 325px" height="420" alt="未命名.GIF" src="http://www.blogjava.net/images/blogjava_net/chaocai/未命名.GIF" width="563" border="0" />
								</v:imagedata>
						</v:shape>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图间的关系</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">4+1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图不仅便于我们记录架构设计，实际上它也指导了我们进行架构设计活动的部分过程。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常我们选择</span>
				<span lang="EN-US">UML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来表现各种视图，以下列出了</span>
				<span lang="EN-US">UML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和各视图的对应关系</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US">4+1</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图</span>
				</b>
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
						<span style="mso-spacerun: yes">                          </span>
						<b style="mso-bidi-font-weight: normal">
								<span style="mso-spacerun: yes">  </span>UML</b>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">场景视图</span>
				<span lang="EN-US">
						<span style="mso-spacerun: yes">         </span>
						<span style="mso-spacerun: yes">                   </span>use case</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">逻辑视图</span>
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                            </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类图</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发视图</span>
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                            </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类图，组件图</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程视图</span>
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                            </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无完全对应</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部署视图</span>
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                            </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部署图</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在架构设计稳定中通常不会给出较多的用例描述，这些是在需求稳定中定义。但是往往架构文档会选择一些用例，列入文档中，这些用例和一些非功能性需求一起用以证明架构的有效和正确性。在逻辑视图中用例的实现是必不可少的一节，尽管架构设计更关注非功能性需求。</span>
		</p>
		<h1 style="MARGIN: 17pt 0cm 16.5pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">融入</span>
				<span lang="EN-US">MDA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的思想</span>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于逻辑视图和开发视图所应包含的内容常常会觉得很难区分两者间的明显界限。逻辑视图包含更多的分析模型与实现技术本身相关性应该较少，如业务对象模型及其扩展。而开发视图则会与实现技术紧密相关。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">随着</span>
				<span lang="EN-US">MDA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">思想的推广，在架构设计文档的撰写方面也产生了影响，我们不难把</span>
				<span lang="EN-US">MDA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">PIM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和逻辑视图联系起来，而把</span>
				<span lang="EN-US">MDA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
				<span lang="EN-US">PSM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和开发视图联系起来。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在编写逻辑视图是我们应该描述与技术平台无关的模型，而开发视图则描述与实现技术平台相关的模型。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如在逻辑视图中表现的某些实体类，我们会在开发视图中转换为</span>
				<span lang="EN-US">EJB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件（实体</span>
				<span lang="EN-US">Bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种做法不仅有利于我们编写架构设计文档，同时更是一种好的架构设计思考流程。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/chaocai/aggbug/71455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2006-09-23 12:48 <a href="http://www.blogjava.net/chaocai/archive/2006/09/23/71455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MVC模式中的通知机制</title><link>http://www.blogjava.net/chaocai/archive/2006/08/05/61974.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Sat, 05 Aug 2006 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2006/08/05/61974.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/61974.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2006/08/05/61974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/61974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/61974.html</trackback:ping><description><![CDATA[<p style="text-align: center; margin: 0cm 0cm 0pt" class="MsoNormal" align="center"><span style="font-family: 宋体; font-size: 22pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span> <span style="font-size: 22pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 22pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式中的通知机制<br />
</span><span style="font-size: 22pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<h1 style="margin: 17pt 0cm 16.5pt 21.6pt" align="center"><span style="line-height: 240%; font-size: 18pt; mso-bidi-font-size: 22.0pt; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"><span style="mso-list: Ignore"><font size="3">蔡超</font> </span></span></h1>
<h1 style="margin: 17pt 0cm 16.5pt 21.6pt"><span style="line-height: 240%; font-size: 18pt; mso-bidi-font-size: 22.0pt; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"><span style="mso-list: Ignore">1<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><font size="5"><span lang="EN-US">MVC</span> <span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">简介</span> </font></h1>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般应用中用户界面的变化相对较为频繁</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">,</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有时需要支持多种表现模式（如</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">WEB</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户端和</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">GUI</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户端），但是数据和业务逻辑相对保持稳定。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC(Model-View-Controller)</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式是一种常用的设计模式</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">,MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将模型</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">,</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">显示和控制进行了分离，可以使得应用更加方便实现对多种表现模式的支持及降低表现形式修改对整体系统的影响。由于本文重点讨论的是</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的通知机制，至于</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的其它内容可以参考其它相关文档。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="text-align: center; margin: 0cm 0cm 0pt" class="MsoNormal" align="center"><span lang="EN-US"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span></p>
<p style="text-align: center; margin: 7.6pt 0cm 8pt" class="MsoCaption" align="center"><font size="2"><span style="font-family: 黑体; mso-ascii-font-family: Arial"><img border="0" alt="1.GIF" src="http://www.blogjava.net/images/blogjava_net/chaocai/1.GIF" width="550" height="385" /> <br />
图表</span> <font face="Arial"><span lang="EN-US"><span style="mso-field-code: ' SEQ 图表 * ARABIC '"><span style="mso-no-proof: yes">1</span> </span>MVC</span> </font><span style="font-family: 黑体; mso-ascii-font-family: Arial">模式</span> <span style="font-family: 宋体; mso-fareast-font-family: 黑体" lang="EN-US"><o:p></o:p></span></font></p>
<h1 style="margin: 17pt 0cm 16.5pt 21.6pt"><span style="line-height: 240%; font-size: 18pt; mso-bidi-font-size: 22.0pt; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"><span style="mso-list: Ignore">2<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><font size="5"><span lang="EN-US">MVC</span> <span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的通知机制</span> </font></h1>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上图是在</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">SUN</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">J2EE BluePrints</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中关于</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的描述</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">,</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在实现</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式时首先应该注意的是模型与视图之间的关系。在这些关系中尤其值得大家注意的是模型通知视图，如果不能正确的设计这个通知机制（模型与视图之间关联实现通知）便会完全违背</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计初衷。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的其中一个目的在于使模式独立与视图，然而不正确的理解和设计通知机制会导致模型和试图的依赖性。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<h2 style="margin: 13pt 0cm 13pt 28.8pt"><span style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial" lang="EN-US"><span style="mso-list: Ignore"><font face="Arial">2.1</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 黑体; mso-ascii-font-family: Arial">采用</span> <span lang="EN-US"><font face="Arial">Observer</font> </span><span style="font-family: 黑体; mso-ascii-font-family: Arial">模式实现通知机制</span> </h2>
<p style="text-indent: 24pt; margin-right: 36pt"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt"><font face="宋体">既要实现模式到视图的通知机制，同时有要确保实现模型与视图的分离。通常我们可以通过<span lang="EN-US">Observer</span>模式来实现这样的通知机制。<br />
</font></span></p>
<p style="text-indent: 24pt; margin-right: 36pt" align="center"><font size="2"><span style="font-family: 黑体; mso-ascii-font-family: Arial"><img border="0" alt="2.GIF" src="http://www.blogjava.net/images/blogjava_net/chaocai/2.GIF" width="414" height="172" /> </span></font></p>
<p style="text-indent: 24pt; margin-right: 36pt" align="center"><br />
图表<font face="Arial"><span lang="EN-US"><span style="mso-field-code: ' SEQ 图表 * ARABIC '"><span style="mso-no-proof: yes">2</span></span> Observer</span></font><span style="font-family: 黑体; mso-ascii-font-family: Arial">模式</span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视图实现</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Observer</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，并向模型注册，模型通过调用所维护的观察者的实例调用</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Update</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来通知视图进行刷新。可见，</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Observer</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口有效的实现了模型和视图间的耦合性的分离。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<h2 style="margin: 13pt 0cm 13pt 28.8pt"><span style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial" lang="EN-US"><span style="mso-list: Ignore"><font face="Arial">2.2</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 黑体; mso-ascii-font-family: Arial">模型通知视图还是控制器通知视图</span> </h2>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="text-align: center; margin: 0cm 0cm 0pt" class="MsoNormal" align="center"></p>
<p style="text-align: center; margin: 7.6pt 0cm 8pt" class="MsoCaption" align="center"><font size="2"><span style="font-family: 黑体; mso-ascii-font-family: Arial"><img border="0" alt="3.GIF" src="http://www.blogjava.net/images/blogjava_net/chaocai/3.GIF" width="221" height="285" /> <br />
图表</span> <font face="Arial"><span lang="EN-US"><span style="mso-field-code: ' SEQ 图表 * ARABIC '"><span style="mso-no-proof: yes">3</span> </span></span></font><span style="font-family: 黑体; mso-ascii-font-family: Arial">基于</span> <span lang="EN-US"><font face="Arial">MVC</font> </span><span style="font-family: 黑体; mso-ascii-font-family: Arial">的</span> <span lang="EN-US"><font face="Arial">J2EE</font> </span><span style="font-family: 黑体; mso-ascii-font-family: Arial">应用</span> </font></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在将</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式应用于的总体结构时，常常会有是模型通知视图还是控制器通知视图的问题，其实我认为这个问题完全取决于对系统各个部分的划分和理解，如果我们把模型层更多划分为数据实体</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">(</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如：</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Entity Bean)</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则可能会发现，其实我们的通知机制是不能由模型部分来完成的，而是由我们的控制器来完成的。这种划分好象有些违背了</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式，但实事上特别是一些想要同时支持</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">B/S</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">C/S</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">J2EE</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用，控制器和模式通知机制常常有较大的耦合性（</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">C/S</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构中，客户完全通过会话</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Bean</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成业务），可能有时在一起实现更好。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">总之，更好的内聚性和更松散的耦合性才是架构设计的重点，应该做出适合自身应用的</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin-right: 36pt"><span lang="EN-US"><o:p><font face="宋体">&nbsp;</font> </o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<h1 style="margin: 17pt 0cm 16.5pt 21.6pt"><span style="line-height: 240%; font-size: 18pt; mso-bidi-font-size: 22.0pt; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"><span style="mso-list: Ignore">3<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="5">结束语</font> </span></h1>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的关键在于分离易变和不易变部分间的耦合性，所以在应用</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式时一定要注意解耦才是关键，同时一定要更据具体的使用环境进行调整，不要生搬硬套，如</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Microsoft</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MFC </span><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用的</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Document-view</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">MVC</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的变体，它把控制器合并到视图中，这是因为考虑了视图与控制器紧耦合的影响。</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">【参考文献】</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"><span style="mso-list: Ignore">1．<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">Sun Microsystem</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">J2EE BluePrints<o:p></o:p></span> </p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"><span style="mso-list: Ignore">2．<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">GOF,Design Patterns,</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">机械工业出版社，</span> <span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US">2002<o:p></o:p></span> </p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者：</span> <span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">蔡超</span><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-size: 10.5pt; mso-bidi-font-size: 12.0pt" lang="EN-US"><o:p>&nbsp;</o:p> </span></p>
<img src ="http://www.blogjava.net/chaocai/aggbug/61974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2006-08-05 18:28 <a href="http://www.blogjava.net/chaocai/archive/2006/08/05/61974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>