??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品天堂成人片AV在线播放,亚洲国产综合无码一区,99久久国产亚洲综合精品http://www.tkk7.com/chaocai/category/8361.htmlzh-cnThu, 19 Aug 2010 03:24:39 GMTThu, 19 Aug 2010 03:24:39 GMT60Ҏ编E原?1)http://www.tkk7.com/chaocai/archive/2009/09/14/295064.html越巅峰越巅峰Mon, 14 Sep 2009 12:28:00 GMThttp://www.tkk7.com/chaocai/archive/2009/09/14/295064.htmlhttp://www.tkk7.com/chaocai/comments/295064.htmlhttp://www.tkk7.com/chaocai/archive/2009/09/14/295064.html#Feedback1http://www.tkk7.com/chaocai/comments/commentRss/295064.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/295064.html1 SRP

SRP(Single Responsible Principle), 单一职责原则Q这是面对的最基本原则Q也是实现弹性设计的最基本原则?/font>

每个cL接口定义应该只包含一U明的职责Q同时仅有一U原因会Dq种定义的修攏V一个复杂的cL接口的定义包含多个责任,很容易你的设计失去Ҏ,很多因素都会Dq个cL接口的变_׃它含有多U职责,q就意味着它是多种服务的提供者,会有多种依赖于它的客LQ他的变更可能会D大范围的变更?/span>

在作者看来,优先U最高的是你首先要保证接口的单一职责及方法的单一职责Q接口通常意味可以更换不同的实玎ͼZ个接口定义过多的职责意味着每个实现都会涉及多个职责Q这导致无法实现更粒度的实现的复用?/span>

面向抽象~成

如果你已l读q?font face="Times New Roman">GOF的《设计模式》,你便知道其中每一个模式都是基于此原则的,抽象Q或接口Q有效的解除了服务调用者和服务提供者间的耦合?/font>

使用配置

通过修改配置文g便可以改变系l的某些Ҏ,q种修改的区别于修改代码Q对?font face="Times New Roman">Java,C++而言q种修改是不需要编译,有的修改甚至可以在运行时生效?/font>DSL地运用可以配置更加h可读性及更强的描q能力。在设计时将实现分ؓ配置及框枉分是非常灉|的结构?/font>


蔡超
HP 软g架构?br /> 软g架构N
SCEA
IBM Certified Solution Designer for OOA&D vUML2
Chaocai2001@yahoo.com.cn




越巅峰 2009-09-14 20:28 发表评论
]]>
MW记Q额外的间接?Beautiful Code)http://www.tkk7.com/chaocai/archive/2009/05/19/271596.html越巅峰越巅峰Tue, 19 May 2009 13:45:00 GMThttp://www.tkk7.com/chaocai/archive/2009/05/19/271596.htmlhttp://www.tkk7.com/chaocai/comments/271596.htmlhttp://www.tkk7.com/chaocai/archive/2009/05/19/271596.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/271596.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/271596.html 

?/span>OO中可以用抽象方法及接口来完成文中通过函数指针和结构体来实现的间接层?br />


Client.java

AppInterface app=new AppImpl();

AppInterface app1=new AppProxy(app);

AppProxy.java

public class AppProxy implements AppInterface{

               private AppInterface appRef;

               public AppProxy(AppInterface appRef){

                              this.appRef=appRef

               }

public void doSomething(){

               /*some codes*/

}

}

通过Proxy来实现间接层Q相互嵌套可以实现多个间接层Qƈ且可以通过一?/span>AppBuilder来创个对象,l合多个间接层。间接层中可以实现文中提及的对参数的预处理?/span>

同时Q我也认为文中提及的间接层也可以?/span>Adapter?/span>



越巅峰 2009-05-19 21:45 发表评论
]]>
Double Dispatch模式http://www.tkk7.com/chaocai/archive/2009/02/19/255640.html越巅峰越巅峰Thu, 19 Feb 2009 13:02:00 GMThttp://www.tkk7.com/chaocai/archive/2009/02/19/255640.htmlhttp://www.tkk7.com/chaocai/comments/255640.htmlhttp://www.tkk7.com/chaocai/archive/2009/02/19/255640.html#Feedback2http://www.tkk7.com/chaocai/comments/commentRss/255640.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/255640.html本文介绍了常见面向对象语aQJava,C#{)OverLoad对于q行时执行的Ҏ邦定的局限,q且如何通过Double Dispatch来实现运行时行ؓ邦定?/font>

Ҏ对象来选择行ؓ问题

public interface Event {

}

public class BlueEvent implements Event {

}

public class RedEvent implements Event {

}

public class Handler {

public void handle(Event event){

System.out.println("It is event");

}

public void handle(RedEvent event){

System.out.println("It is RedEvent");

}

public void handle(BlueEvent event){

System.out.println("It is BlueEvent");

}

}

public class Main {

public static void main(String[] args) {

Event evt=new BlueEvent();

new Handler().handle(evt);

}

}

你认行结果是什么呢Q?/font>

l果Q?/font>It is event

是不是有点出乎意料,不是It is BlueEventQ这是应为Overloadq不支持在运行时Ҏ参数的运行时cd来帮定方法,所以要执行哪个Ҏ是在~译时就选定了的?/font>

2 Double Dispatch Pattern

׃Java,C++及C#都具有上q局限,通常我们只能通过Switch或ifl构来实玎ͼ当然q种实现方式既不优雅而且影响代码的可l护性?/font>

通过以下的Double Dispatch Pattern便可以优雅的实现?/font>

public interface Event {

public void injectHandler(EventHandler v);

}

public class BlueEvent implements Event {

public void injectHandler(EventHandler v) {

v.handle(this);

}

}

public class RedEvent implements Event {

public void injectHandler(EventHandler v) {

v.handle(this);

}

}

public class EventHandler {

public void handle(BlueEvent e){

System.out.println("It is BlueEvent");

}

public void handle(RedEvent e){

System.out.println("It is RedEvent");

}

}

public class Main {

public static void main(String[] args) {

Event evt=new BlueEvent();

evt.injectHandler(new EventHandler());

}

}

其实设计模式QGoF)中的Visitor模式是Double Dispatch的一U应用?br />

蔡超
HP 软g架构?br /> 软g架构N
SCEA,SCBCD,MCSD
IBM Certified Solution Designer for OOA&D vUML2
Chaocai2001@yahoo.com.cn,chao.cai@hp.com



越巅峰 2009-02-19 21:02 发表评论
]]>
OSGi实现动态特性的关键模式http://www.tkk7.com/chaocai/archive/2008/10/15/234529.html越巅峰越巅峰Wed, 15 Oct 2008 13:40:00 GMThttp://www.tkk7.com/chaocai/archive/2008/10/15/234529.htmlhttp://www.tkk7.com/chaocai/comments/234529.htmlhttp://www.tkk7.com/chaocai/archive/2008/10/15/234529.html#Feedback4http://www.tkk7.com/chaocai/comments/commentRss/234529.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/234529.html 1 Broker模式Q实现服务提供者与服务使用者的分离及解耦。Bundle通过所能提供的服务自己注册至FrameworkQ调用者通过Framework查找所需的服务。Bundle的服务注册是实现服务自动发现的基?br />  
2 监听者模式:q是实现动态特性的关键Q通过监听者模式服务的使用?实现监听接口)可以获得所依赖的服务提供者(BundleQ的状态变化的通知Q从而动态处理与服务提供者间的关pM实现动态特性,不仅如此OSGi Framework自n同样有效的融合了q种通知机制Q得实现监听者接口的Bundle可以了解Framework的状态变化?br />  
在我们的应用pȝ中借鉴OSGi的原理,同样可以有效地实现动态特性?br />

蔡超
软g架构?br /> 软g架构N
SCEA,SCBCD
IBM Certified Solution Designer for OOA&D vUML2
Chaocai2001@yahoo.com.cn

越巅峰 2008-10-15 21:40 发表评论
]]>
DAO模式最佛_?/title><link>http://www.tkk7.com/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.tkk7.com/chaocai/archive/2008/06/25/210685.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/210685.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2008/06/25/210685.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/210685.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/210685.html</trackback:ping><description><![CDATA[<p> </p> DAO看似是一个非常简单的模式Q但q个模式却十分重要,它可以帮助我们实现持久化逻辑和业务逻辑的分;它可以帮助我们实现对多种持久化实现的支持?br /> 同时QDAO模式q没有看hq么单,要真正发挥它的威力需注意的方面很多,而这些方面常常被大家忽略Q以下是本hȝ的一些最佛_c?br /> 1 不要在DAO上控制事务的边界<br /> 应该在Façade层控制事务的边界Q这样可以提高DAO的复用性,使它适用于不同的事务{略?br /> 2 不要q分使用Checked Exception<br /> 开发者常怼DAO中的各种异常通通捕捉ƈ通过Checked Exception抛出Q其实这是中不好的习惯,因ؓDAO中发生的异常常常是不可恢复的Q如Q数据库q接问题{)Q既然如此就应该使用RuntimeException异常抛出Q用这U异常还有一个好处就是在CMP的情况下可以自动引发事务的回滚?br /> 3 不要在DAO中处理懒加蝲问题<br /> 使用Hibernate׃l常遇到懒加载问题,但是q个问题不应该在DAO中解冻Iq样会媄响DAO的复用性,应ؓ要加载那些对象域往往是和界面相关的,q个问题应该在Façade层中解决Q应是离表现层较q的一层?br />  <br /> <br /> http://dev2dev.bea.com.cn/blog/chaocai/200806/dao_24_1070.html<br />  <br /> 蔡超<br /> 软g架构?br /> 软g架构N<br /> SCEA<br /> IBM Certified Solution Designer for OOA&D vUML2<br /> Chaocai2001@yahoo.com.cn<br /> <img src ="http://www.tkk7.com/chaocai/aggbug/210685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2008-06-25 21:49 <a href="http://www.tkk7.com/chaocai/archive/2008/06/25/210685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现IoC,AOP容器 源码下蝲http://www.tkk7.com/chaocai/archive/2008/05/27/203261.html越巅峰越巅峰Tue, 27 May 2008 08:54:00 GMThttp://www.tkk7.com/chaocai/archive/2008/05/27/203261.htmlhttp://www.tkk7.com/chaocai/comments/203261.htmlhttp://www.tkk7.com/chaocai/archive/2008/05/27/203261.html#Feedback5http://www.tkk7.com/chaocai/comments/commentRss/203261.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/203261.html http://www.tkk7.com/chaocai/archive/2008/05/26/203020.html
源码下蝲
http://www.tkk7.com/Files/chaocai/mini-container-beta0.9-src.rar
希望对大家有帮zQ也期待大家的反馈!

越巅峰 2008-05-27 16:54 发表评论
]]>
自己实现IoC,AOP容器http://www.tkk7.com/chaocai/archive/2008/05/26/203020.html越巅峰越巅峰Mon, 26 May 2008 12:21:00 GMThttp://www.tkk7.com/chaocai/archive/2008/05/26/203020.htmlhttp://www.tkk7.com/chaocai/comments/203020.htmlhttp://www.tkk7.com/chaocai/archive/2008/05/26/203020.html#Feedback8http://www.tkk7.com/chaocai/comments/commentRss/203020.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/203020.html阅读全文

越巅峰 2008-05-26 20:21 发表评论
]]>
q细_度的Bundle是成功实现OSGi应用的大?/title><link>http://www.tkk7.com/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.tkk7.com/chaocai/archive/2008/04/15/193219.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/193219.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2008/04/15/193219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/193219.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/193219.html</trackback:ping><description><![CDATA[  <p><span style="font-family: 宋体">q期做了几个使用</span>OSGi<span style="font-family: 宋体">开发的应用Q发C用过l粒度的</span>Bundle<span style="font-family: 宋体">不会l项目带来Q何好处,而很多设计h员实际都会在使用</span>OSGi<span style="font-family: 宋体">q_旉入这个陷阱?/span></p> <p><span style="font-family: 宋体">首先我们分析</span>OSGi<span style="font-family: 宋体">的特点及可以l我们应用带来的好处</span></p> <p>1 <span style="font-family: 宋体">良好的动态特?/span></p> <p>2 <span style="font-family: 宋体">更细_度的类装蝲控制Q多个版本组件在同一q行环境中共同运?/span></p> <p>3 <span style="font-family: 宋体">?/span>JVM<span style="font-family: 宋体">内部实现</span>SOA<span style="font-family: 宋体">Q我个h倒是认ؓ</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: 宋体">h考你的应用程序真的需要这些吗Q?/span></p> <p><span style="font-family: 宋体">很多设计和开发h员都会在设计和实现时忽略应用的真正需要和</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: 宋体">开发和调试带来的复杂性;同时也要明白动态特性的支持q不是仅仅采?/span>OSGi<span style="font-family: 宋体">q_可以搞定的Q要真正实现动态特性必L意模块的启动序无关性及对其所依赖服务的监听等Q这些都会大大增加系l实现和调试的复杂性?/span></p> <p><span style="font-family: 宋体">其实我们应该认真分析应用是否需要这?/span>OSGi<span style="font-family: 宋体">的特性及q些Ҏ应该在应用的那些部分体玎ͼ例如我们可以在扩展方面采?/span>Bundle<span style="font-family: 宋体">实现扩展插gQ至于其它部分则不必采用q多?/span>Bundles<span style="font-family: 宋体">Q甚臛_以采用一个大?/span>Bundle<span style="font-family: 宋体">Q而其内部则可以采用如</span>Spring<span style="font-family: 宋体">来帮助我们实现模块化Q?/span></p> <p><span style="font-family: 宋体">同时Q不要忘记其他的</span>framework<span style="font-family: 宋体">同样提供了很好的lg化的基础架构?/span>Spring<span style="font-family: 宋体">Q?/span>Pico-Container<span style="font-family: 宋体">Q在</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: 宋体">咨询N</span><span style="font-size: 10.5pt; font-family: 'MS Shell Dlg'"><br clear="all" /> SCEA(1.2&5)<br clear="all" /> IBM Certified OOA&D Solution Designer vUML2</span> <img src ="http://www.tkk7.com/chaocai/aggbug/193219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2008-04-15 21:43 <a href="http://www.tkk7.com/chaocai/archive/2008/04/15/193219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分层模式中的常见问题http://www.tkk7.com/chaocai/archive/2008/03/19/187361.html越巅峰越巅峰Wed, 19 Mar 2008 13:48:00 GMThttp://www.tkk7.com/chaocai/archive/2008/03/19/187361.htmlhttp://www.tkk7.com/chaocai/comments/187361.htmlhttp://www.tkk7.com/chaocai/archive/2008/03/19/187361.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/187361.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/187361.html
引言
分层l构是目前复杂应用系l开发时普遍使用的模式,软g中层之间的依赖关pȝ束是比较宽松的,q不要求上层仅可以依赖于直接下层Q而是上层可以依赖于它的所有下层?/div>
设计中我们会把各U系l的各种lg映射至不同层中,而在我所接触的一些实际项目中设计人员在映这U组件和层间的关pLl常无意中破坏了层结构的依赖关系U束?/div>

 

图表 1 典型分层l构

设计中的常见问题
问题一:数据传输对象QDTOQ是否应该属于业务层Q?/font>
在J2EE开发的l典著作《Core J2EE Patterns》中数据传输对象被划分在业务层模式中Q那么是否数据传输对象应该被映射C务层呢?
数据讉K对象QDAOQ在该著作中是被映射到整合层的,q样׃出现一个违反层依赖U束的问题,因ؓ数据讉K对象是要依赖于数据传输对象的Q因此下层就会出现对上层的依赖了?/div>
所以本为DTO是在各层中传输数据的Q我们可以不必强求的把他们映到上述层次中,可以把他们放|在一个公共包中?/div>
 
问题?使用POJO作业务对象的轻量U架构与上述层模型的映射
在用POJO的轻量l构中我们通常会用持久化框架Q如Hibernate/JPAQ同时会在架构中引入仓库对象(Repository Object)Q负责业务对象的获取和保存。(注意Q他的功能和DAO是有区别的,仓库对象中通常只应包括业务对象的获取和保存逻辑Q?/div>
通常设计人员会把业务对象映射至业务层Q而将仓库对象映射x合层。由于仓库对象对于业务对象的依赖关系׃破坏依赖关系U束Q所以这U映方式显然不正确?/div>
下图是作者推荐的映射方式

 

图表 2 轻量U架构参考模?/font>

 
可以看到业务对象和仓库对象都被映至业务层,而持久化框架被映到了整合层?/div>
 
ȝ

因此大家在设计过E中不要仅仅分层结构留于Ş式,而要时刻注意设计是否W合q种架构模式Q这h能真正发挥这U架构模式的优势?/span>

 

JavaEE 咨询N
SCEA (1.2&5.0)
IBM Certified Solution Designer for OOA&D UML2


越巅峰 2008-03-19 21:48 发表评论
]]>黑板模式的常见实现方?http://www.tkk7.com/chaocai/archive/2007/11/07/158712.html越巅峰越巅峰Wed, 07 Nov 2007 00:57:00 GMThttp://www.tkk7.com/chaocai/archive/2007/11/07/158712.htmlhttp://www.tkk7.com/chaocai/comments/158712.htmlhttp://www.tkk7.com/chaocai/archive/2007/11/07/158712.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/158712.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/158712.html

越巅峰 2007-11-07 08:57 发表评论
]]>
Spring构徏应用pȝ的最x构与模式实践Q?Q?/title><link>http://www.tkk7.com/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.tkk7.com/chaocai/archive/2007/06/08/122789.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/122789.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2007/06/08/122789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/122789.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/122789.html</trackback:ping><description><![CDATA[??br>SCEAQSCBCDQMCSDQIBM RUP Specilist<br>北京天融信Y件架构师<br>SUN,Microsoft培训中心牚w高端教师<br>常年提供架构咨询服务<br>chaocai2001@yahoo.com.cn Q?10-82776427<br><br>问题Q?br>在spring+hibernate的常见架构中Q常会应为hibernate的gq加载遇C些麻烦。如Hibernate的引入用脱领域对象直接取代了DTO,然而前台组l显C时怼应ؓq领域对象的一些关pd未被加蝲而抛出异常(其实延迟加蝲是优化系l性能的一U有效方式)?br>Z使显C层正常工作Q我们就必须在业务层昑ּ的加载这些表现层会用到的延迟加蝲的关pd对象。而这L工作不仅需要额外的代码Qƈ且这些代码往往也与所q行的业务逻辑无关。ƈ且表现层的变化较多这样一来如果上qC码进入业务层׃D业务层跟随表现层的变化?br>解决ҎQ?br>?#8220;Spring构徏应用pȝ的最x构与模式实践Q?Q?#8221;中将逻辑层分ZFa&ccedil;ade和ApplicationService两层?br>Fa&ccedil;ade的方法组l是针对客户端请求的Q所以如果我们把业务逻辑装在ApplicationService对象中,而把q对象产生Q包括根据表现层初始化gq加载对象,关闭SessionQ。这样便可以有效的防止表现层逻辑混入业务逻辑中?br> <img src ="http://www.tkk7.com/chaocai/aggbug/122789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2007-06-08 10:48 <a href="http://www.tkk7.com/chaocai/archive/2007/06/08/122789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring构徏应用pȝ的最x构与模式实践Q?Q?http://www.tkk7.com/chaocai/archive/2007/05/08/115937.html越巅峰越巅峰Tue, 08 May 2007 06:25:00 GMThttp://www.tkk7.com/chaocai/archive/2007/05/08/115937.htmlhttp://www.tkk7.com/chaocai/comments/115937.htmlhttp://www.tkk7.com/chaocai/archive/2007/05/08/115937.html#Feedback1http://www.tkk7.com/chaocai/comments/commentRss/115937.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/115937.htmlSCEAQSCBCDQMCSDQIBM RUP Specilist
北京天融信Y件架构师
SUN,Microsoft培训中心牚w高端教师
常年提供架构咨询服务
chaocai2001@yahoo.com.cn Q?10-82776427

引言
在用Spring构徏应用时和采用EJB构徏应用一样同样也存在不少常用模式和最佛_践,当然很多Core J2EE Pattern仍然是我们构建spring应用中的优秀模式Q不q有的也不再适用了(如:IoC的应用得Service Locator不再适用QHibernate取代Entity Bean使得DTO不再适用{)?br>下文是一些在以Spring为核心的架构中的常见模式和架构最佛_c?br>



图表 1 Spring应用常见架构模式列表
DAO模式
虽然采用了诸如Hibernateq样的O/R Mapping工具或是iBatesq样的SQL Mapping工具但是采用DAO模式仍有相当好处?br>在实际应用中我们怼遇到如下问题Q?br>1 性能问题Q由于性能问题我们可能要改变数据访问方式,如采用JDBC替换Hibernateq时Q这时如果采用了DAO模式Q数据访问被有效的封装和业务逻辑完全分离Q易于实现替换?br>2 UL问题Q需要支持多U数据库QDAO模式仍然是一U稳妥的选择。虽然诸如Hibernate及iBates也提供很好的数据库无x,但如果用某些数据库的特D功能时Q就会出现问题?br>当然Q对于是否采用DAO模式也不可一概而论Q应Z毕竟会增加应用的开发复杂性。个为很关键的一个判定条件是业务逻辑是否会和持久化逻辑混合?br>
Application Service模式
装一定的业务逻辑和功能,提高复用性,即防止Fa&ccedil;ade和业务对象的臃肿。注意在此可以应用Command模式及Strategy模式提供pȝ可维护性和可扩展性?br>q个模式很重要,但常常被大家忽略Q这时应为我们常会把逻辑攑֜Fa&ccedil;ade中,其实q是很错误的。例如:我们可能会提供多U不同Fa&ccedil;ade以适应不同的访问方式,q样׃出现大量重复的业务逻辑代码?br>
Fa&ccedil;ade模式
为客L提供讉K业务lg的统一模式。便于实现对不同讉K方式的支持(如:q程或本圎ͼ。特别在q程调用旉过暴露_粒度的接口Q提高系l的性能?br>同时Q可以根据客L不同Q通过不同Fa&ccedil;ade来控制客L操作?

越巅峰 2007-05-08 14:25 发表评论
]]>
同步代理模式 Synchronization Proxy Patternhttp://www.tkk7.com/chaocai/archive/2006/11/10/80452.html越巅峰越巅峰Fri, 10 Nov 2006 09:28:00 GMThttp://www.tkk7.com/chaocai/archive/2006/11/10/80452.htmlhttp://www.tkk7.com/chaocai/comments/80452.htmlhttp://www.tkk7.com/chaocai/archive/2006/11/10/80452.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/80452.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/80452.html 模式发现?/span> : 蔡超

北京天融信,软g架构?/span>

SUN certified Enterprise Architect

Microsoft certified Solution Developer

IBM certified RUP Specialist

联系方式 :cai_chao@topsec.com.cn,chaocai2001@yahoo.com.cn

010-82776427

语境

在基于异步通信方式的系l中Q实现模块的同步调用?/span>

问题

消息队列已经成ؓ目前很多软g选用的通讯方式Q消息模式得不同分布式lg间的耦合性较为松散,提高了系l的可维护性和可扩充性。但是有时我们希望在q种情况下能够模拟同步的调用方式Q希望能够通过一个组仉明的帮我们实现q种异步和同步调用的转换?/span>

解决Ҏ

p1.jpg
图表
1 Z消息的分布式pȝ

上图是一U常见的Z消息的分布系l结构,pȝ中包含两条队列。命令队列用于传送模块间怺调用的命令对象,响应队列用于传送命令处理后的响应结果对象?/span>

在通常情况下消息队列上的模块会以异步的方式工作Q这U情况下模块通常不关心命令执行后的状况,常常是不返回值的?/span>

Z模拟同步调用我们通过一?/span> SynProxy lg来帮助我们完成由异步到同步调用的模拟。?/span> Client 对其他模块的调好像是同步的一栗?/span>

SynProxy lg的结构如下:

p2.jpg
图表
2 SynProxy 的静态结?/span>

SynProxy: l织完成异步到同步调用的转换

WaitingQueue: 存放q未获得执行q回值的 Command 对象

UIDCreator: 产生能够唯一标示每个 Command 对象?/span> UID

ResponseReceiver: 监听响应队列中的响应消息Q它在独立的U程中运?/span>

Command Q命令对?/span>

Response Q响应对?img height="769" alt="p3.jpg" src="http://www.tkk7.com/images/blogjava_net/chaocai/p3.jpg" width="860" border="0" />

 

图表 3 异同步调用转化成同步调用的q程

部分解释Q?/span> ( 以上以在 JAVA 环境中ؓ?/span> )

Wait 表示调用 Command ?/span> wait Ҏd住当前线E?/span>

Command 执行模块在执行了响应操作后生?/span> Response 对象用于攑֛l果Q?/span> Response 对象中的 UID 属性应该与处理?/span> Command ?/span> UID 的值相?/span>

Notify 表示调用 Command ?/span> notify Ҏ唤醒被阻塞的U程

上面q程中的 wait 讄了阻塞的时旉Q来自于 Command 对象的属性|



越巅峰 2006-11-10 17:28 发表评论
]]>
C架构设计文档的编?/title><link>http://www.tkk7.com/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.tkk7.com/chaocai/archive/2006/09/23/71455.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/71455.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2006/09/23/71455.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/71455.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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'">Q?/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'">Q?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt">MCSD<br />北京天融信Y件架构师<br /> SUN,Microsoft培训中心牚w高端教师<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'">Q?/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'">软g架构设计已经逐渐成ؓC软g开发过E的核心Q然而能够清晰表明架构设计ƈ不是一件容易的事,面向对象开发而言Q?/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'">的描q有几个不同版本Q或包含的视图不同,或视囄名称不同Q,文中?/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'">视图包括Q逻辑视图Q?/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'">Q,开发视图(</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'">Q,q程视图Q?/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'">Q,物理视图Q?/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'">Q和场景视图Q?/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'">Q?/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.tkk7.com/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'">视图不仅便于我们记录架构设计Q实际上它也指导了我们进行架构设计活动的部分q程?/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'">来表现各U视图,以下列出?/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'">和各视图的对应关p?/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'">cd</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'">cdQ组件图</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'">q程视图</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'">部v视图</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'">部v?/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'">在架构设计稳定中通常不会l出较多的用例描qͼq些是在需求稳定中定义。但是往往架构文档会选择一些用例,列入文档中,q些用例和一些非功能性需求一L以证明架构的有效和正性。在逻辑视图中用例的实现是必不可的一节,管架构设计更关注非功能性需求?/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'">对于逻辑视图和开发视图所应包含的内容常常会觉得很隑֌分两者间的明昄限。逻辑视图包含更多的分析模型与实现技术本w相x应该较,如业务对象模型及其扩展。而开发视囑ֈ会与实现技术紧密相兟?/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'">思想的推q,在架构设计文档的撰写斚w也生了影响Q我们不难把</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'">和逻辑视图联系hQ而把</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'">和开发视图联pv来?/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'">在编写逻辑视图是我们应该描qC技术^台无关的模型Q而开发视囑ֈ描述与实现技术^台相关的模型?/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'">如在逻辑视图中表现的某些实体c,我们会在开发视图中转换?/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'">lgQ实?/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'">Q?/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'">q种做法不仅有利于我们编写架构设计文档,同时更是一U好的架构设计思考流E?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <img src ="http://www.tkk7.com/chaocai/aggbug/71455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2006-09-23 12:48 <a href="http://www.tkk7.com/chaocai/archive/2006/09/23/71455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MVC模式中的通知机制http://www.tkk7.com/chaocai/archive/2006/08/05/61974.html越巅峰越巅峰Sat, 05 Aug 2006 10:28:00 GMThttp://www.tkk7.com/chaocai/archive/2006/08/05/61974.htmlhttp://www.tkk7.com/chaocai/comments/61974.htmlhttp://www.tkk7.com/chaocai/archive/2006/08/05/61974.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/61974.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/61974.html关于 MVC 模式中的通知机制

蔡超

1         MVC ?/span>

一般应用中用户界面的变化相对较为频J?/span> , 有时需要支持多U表现模式(?/span> WEB 客户端和 GUI 客户端)Q但是数据和业务逻辑相对保持E_?/span>

MVC(Model-View-Controller) 模式是一U常用的设计模式 ,MVC 模?/span> , 昄和控制进行了分离Q可以得应用更加方便实现对多种表现模式的支持及降低表现形式修改Ҏ体系l的影响。由于本文重点讨论的?/span> MVC 中的通知机制Q至?/span> MVC 的其它内容可以参考其它相x档?/span>

 

 

1.GIF
图表
1 MVC 模式

2         MVC 的通知机制

上图是在 SUN ?/span> J2EE BluePrints 中关?/span> MVC 模式的描q?/span> , 在实?/span> MVC 模式旉先应该注意的是模型与视图之间的关pR在q些关系中尤其值得大家注意的是模型通知视图Q如果不能正的设计q个通知机制Q模型与视图之间兌实现通知Q便会完全违?/span> MVC 的设计初街?/span> MVC 模式的其中一个目的在于模式独立与视图,然而不正确的理解和设计通知机制会导致模型和试图的依赖性?/span>

2.1     采用 Observer 模式实现通知机制

既要实现模式到视囄通知机制Q同时有要确保实现模型与视图的分R通常我们可以通过Observer模式来实现这L通知机制?br />

2.GIF


图表2 Observer模式

视图实现 Observer 接口Qƈ向模型注册,模型通过调用所l护的观察者的实例调用 Update Ҏ来通知视图q行h。可见, Observer 接口有效的实C模型和视N的耦合性的分离?/span>

 

 

2.2     模型通知视图q是控制器通知视图

 

3.GIF
图表
3 Z MVC ?/span> J2EE 应用

在将 MVC 模式应用于的Ml构Ӟ常常会有是模型通知视图q是控制器通知视图的问题,其实我认个问题完全取决于对系l各个部分的划分和理解,如果我们把模型层更多划分为数据实?/span> ( 如: Entity Bean) 则可能会发现Q其实我们的通知机制是不能由模型部分来完成的Q而是由我们的控制器来完成的。这U划分好象有些违背了 MVC 模式Q但实事上特别是一些想要同时支?/span> B/S ?/span> C/S ?/span> J2EE 应用Q控制器和模式通知机制常常有较大的耦合性( C/S l构中,客户完全通过会话 Bean 来完成业务)Q可能有时在一起实现更好?/span>

MQ更好的内聚性和更松散的耦合性才是架构设计的重点Q应该做出适合自n应用?/span> MVC 架构?/span>

 

 

3         l束?/font>

MVC 模式的关键在于分L变和不易变部分间的耦合性,所以在应用 MVC 模式时一定要注意解耦才是关键,同时一定要更据具体的用环境进行调_不要生搬套Q如 Microsoft ?/span> MFC 采用?/span> Document-view MVC 的变体,它把控制器合q到视图中,q是因ؓ考虑了视图与控制器紧耦合的媄响?/span>

 

【参考文献?/span>

1Q?span style="font: 7pt 'Times New Roman'">  Sun Microsystem Q?/span> J2EE BluePrints

2Q?span style="font: 7pt 'Times New Roman'">  GOF,Design Patterns, 机械工业出版C, 2002

 

作者: 蔡超 

 



越巅峰 2006-08-05 18:28 发表评论
]]>
վ֩ģ壺 Ļɫͼ| ѻվ߿| ޳avѿ| þaѹۿ| ĻþþƷVA| ȫƵѹۿӾ| avպavŷv| mate20pro鶹| Ů߲| | ҹһ| ĻƷ| Ʒվ| ձ| ѹʵj߹ۿ| Ʒlvɫ| ձվۿ| Ůվ| þѾƷav| ͼƬ| MV߹ۿѸ| ޹Ʒۿþ| yw855.cƵ| Ƶ| һѹۿwwwƵ| ۺһպ| av뾫Ʒ| ĻӰԺ4hu| ѵɫƵ| 2019Ļ߹ۿ| av߹ۿ| ۺɫһС˵| Ƶ| Ƭ߹ۿѹۿȫй | ȫ߲ëƬ| ޹˾Ʒһ | 椸ѹۿ| ˾Ʒѿ| ޹պƷ| 鸣ۺĻһƵ1 | ĻƷ|