??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
典型的三层结?br> 三层l构估计大家都很熟悉了。就是表C(presentationQ层, 领域QdomainQ层, 以及基础架构QinfrastructureQ层?br> 表示层逻辑主要处理用户和Y件的交互。现在最行的莫q于视窗囑Ş界面QwimpQ和Zhtml的界面了。表C层的主要职责就是ؓ用户提供信息Q以及把用户的指令翻译。传送给业务层和基础架构层?基础架构层逻辑包括处理和其他系l的通信Q代表系l执行Q务。例如数据库pȝ交互Q和其他应用pȝ的交互等。大多数的信息系l,q个层的最大的逻辑是存储持久数据?br> q有一个就是领域层逻辑Q有时也被叫做业务逻辑。它包括输入和存储数据的计算。验证表C层来的数据Q根据表C层的指令指z一个基架构层逻辑?br> 领域逻辑中,ZL搞不清楚什么事领域逻辑Q什么是其它逻辑。例如,一个销售系l中有这样一个逻辑Q如果本月销售量比上个月增长10Q,p用红色标记。要实现q个功能Q你可能会把逻辑攑֜表示层中Q比较两个月的数字,如果出10Q,标CؓU色?br> q样做,你就把领域逻辑攑ֈ了表C层中了。要分离q两个层Q你应该现在领域层中提供一个方法,用来比较销售数字的增长。这个方法比较两个月的数字,q返回booleancd。表C层则简单的调用该方法,如果q回trueQ则标记为红艌Ӏ?
———————————————?/p>
| 客户端层 | 用户交互QUI实现
| Browser,WirelessDevice,WebService | Http, Soap 协议(SOP体系)
———————————————?
———————————————?
| 表现?nbsp; | 集中dQ会话管?
| Struts,Jsf,Webwork,Tapstry, Velocity | 内容创徏Q格式,传?
———————————————?
———————————————?
| 业务服务?nbsp; | 业务逻辑,事务,数据,服务
| SessionEJBQSpringQJdoframework) | SessionEjbQPOJO Service
———————————————?
———————————————?
| 集中?nbsp; | 资源适配器,遗留/外部pȝ
|Jms,Jdbc,Connnector,External Service | 规则引擎Q工作流
———————————————?
(持久化EntityBean,Hibernate,iBatis,Jdo,Dao,TopLink etc.)
———————————————?
| 资源?nbsp; | 资源Q数据库Q外部服?
| DataBase,Resource,External Service | (大型LQB2B集中pȝ)
———————————————?
原文摘录如下Q?
Part 1 ?/b>
层(layerQ这个概念在计算机领域是非常了不得的一个概c计机本n׃C一U层的概念:pȝ调用层、设备驱动层、操作系l层、CPU指o集。每个层都负责自q职责。网l同样也是层的概念,最著名的OSI的七层协议?br> 层到了Y仉域也一样好用。ؓ什么呢Q我们看看用层技术有什么好处:
?你用层Q但是不需要去了解层的实现l节?br> ?可以使用另一U技术来改变基础的层Q而不会媄响上面的层的应用?br> ?可以减少不同层之间的依赖?br> ?Ҏ制定出层标准?br> ?底下的层可以用来建立上的层的多Ҏ务?当然Q层也有qQ?br> ?层不可能装所有的功能Q一旦有功能变动Q势必要波及所有的层?br> ?效率降低?br> 当然Q层最隄一个问题还是各个层都有些什么,以及要承担何U责仅R?br>典型的三层结?br> 三层l构估计大家都很熟悉了。就是表C(presentationQ层, 领域QdomainQ层, 以及基础架构QinfrastructureQ层?br> 表示层逻辑主要处理用户和Y件的交互。现在最行的莫q于视窗囑Ş界面QwimpQ和Zhtml的界面了。表C层的主要职责就是ؓ用户提供信息Q以及把用户的指令翻译。传送给业务层和基础架构层?基础架构层逻辑包括处理和其他系l的通信Q代表系l执行Q务。例如数据库pȝ交互Q和其他应用pȝ的交互等。大多数的信息系l,q个层的最大的逻辑是存储持久数据?br> q有一个就是领域层逻辑Q有时也被叫做业务逻辑。它包括输入和存储数据的计算。验证表C层来的数据Q根据表C层的指令指z一个基架构层逻辑?br> 领域逻辑中,ZL搞不清楚什么事领域逻辑Q什么是其它逻辑。例如,一个销售系l中有这样一个逻辑Q如果本月销售量比上个月增长10Q,p用红色标记。要实现q个功能Q你可能会把逻辑攑֜表示层中Q比较两个月的数字,如果出10Q,标CؓU色?br> q样做,你就把领域逻辑攑ֈ了表C层中了。要分离q两个层Q你应该现在领域层中提供一个方法,用来比较销售数字的增长。这个方法比较两个月的数字,q返回booleancd。表C层则简单的调用该方法,如果q回trueQ则标记为红艌Ӏ?br>例子
层技术不存在说永恒的技巧。如何用都要看具体的情冉|能够军_Q下面我列Z三个例子Q?br> 例子1Q一个电子商务系l。要求能够同时处理大量用LhQ用L范围遍及全球Q而且数字q在不断增长。但是领域逻辑很简单,无非是订单的处理Q以 及和库存pȝ的连接部分。这p求我?、表C层要友好,能够适应最q泛的用P因此采用html技术;2、支持分布式的处理,以胜d时几千的讉KQ?3、考虑未来的升U?br> 例子2Q一个租借系l。系l的用户的多,但是领域逻辑很复杂。这p求我们制作一个领域逻辑非常复杂的系l,另外Q还要给他们的用h供一个方便的输入界面。这Pwimp是一个不错的选择?br> 例子3Q简单的pȝ。非常简单,用户、逻辑。但是也不是没有问题Q简单意味着要快速交付,q且q要充分考虑日后的升U。因为需求在不断的增加之中?br>何时分层
q样的三个例子,p求我们不能够一概而论的解决问题,而是应该针对问题的具体情况制定具体的解决Ҏ。这三个例子比较典型?br> W二个例子中Q可能需要严格的分成三个层次Q而且可能q要加上另外的中介(mediatingQ层。例3则不需要,如果你要做的仅是查看数据Q那仅需要几个server面来放|所有的逻辑可以了?br> 我一般会把表C层和领域层/基础架构层分开。除非领域层/基础架构层非常的单,而我又可以用工hL的绑定这些层。这U两层架构的最好的例子?是在VB、PB的环境中Q很Ҏ可以构建出一个基于SQL数据库的windows界面的系l。这L表示层和基础架构层非常的一_但是一旦验证和计算 变得复杂hQ这U方式就存在先天~陷了?br> 很多时候,领域层和基础架构层看h非常cMQ这时候,其实是可以把它们攑֜一L。可是,当领域层的业务逻辑和基架构层的l织方式开始不同的时候,你就需要分开二者?br>更多的层模式
三层的架构是最为通用的,其是对ISpȝ。其它的架构也有Q但是ƈ不适用于Q何情c?br> W一U是Brown model [Brown et al]。它有五个层Q表C层QPresentationQ,控制/中介层(Controller/MediatorQ,领域层(DomainQ? 数据映射层(Data MappingQ? 和数据源层(Data SourceQ。它其实是在三层架构种增加了两个中间层。控?中介层位于表C层和领域层之间Q数据映层位于领域层和基础架构层之间?br> 表示层和领域层的中介层,我们通常UCC?领域中介层,是一个常用的分层ҎQ通常针对一些非可视的控件。例如ؓ特定的表C层l织信息格式Q在?同的H口间导航,处理交易边界Q提供Server的facade接口Q具体实现原理见设计模式Q。最大的危险是Q一些领域逻辑被放到这个层里,影响到其 它的表示层?br> 我常常发现把行ؓ分配l表C层是有好处的。这可以化问题。但表示层模型会比较复杂Q所以,把这些行为放到非可视化的对象中,q提取出一个表C?领域中介层还是值得的?br> Brown ISA
表示?表示?br> 控制/中介?表示-领域中介?br> 领域?领域?br> 数据映射?数据库交互模式中的Database Mapper
数据源层 基础架构?br> 领域层和基础架构层之间的中介层属于本书中提到的Database Mapper模式Q是三种领域层到数据q接的办法之一。和表示-领域中介层一|有时候有用,但不是所有时候都有用?br> q有一个好的分层架构是J2EE的架构,q方面的讨论可以见『J2EE核心模式』一书。他的分层是客户层(ClientQ,表示层(PresentationQ,业务层(Business Q,整合层(IntegrationQ,资源层(ResourceQ。差别如下图Q?br> J2EE核心 ISA
客户?q行在客h上的表示?br> 表示?q行在服务器上的表示?br> 业务?领域?br> 整合?基础架构?br> 资源?基础架构层通信的外部数?br> 微Y的DNA架构定义了三个层Q表C层QpresentationQ,业务层(businessQ,和数据存储层Qdata accessQ,q和我的架构怼Q但是在数据的传递方式上q有很大的不同。在微Y的DNA中,各层的操作都Z数据存储层传出的SQL查询l果集。这L话,实际上是增加了表C层和业务层同数据存储层之间的耦合度?DNA的记录集在层之间的动作类gData Transfer Object?
Part 2 l织领域逻辑
要组l基于层的系l,首要的是如何l织领域逻辑。领域逻辑的组l有好几U模式。但其中最重要的莫q于两种ҎQTransation Script和Domain Model。选定了其中的一U,其它的都Ҏ军_。不q,q两者之间ƈ没有一条明昄分界Uѝ所以如何选取也是门大学问。一般来_我们认ؓ领域逻辑比较复杂的系l可以采用Domain Model?br> Transation Script是对表C层用户输入的处理程序。包括验证和计算Q存储,调用其它pȝ的操作,把数据回传给表示层。用L一个动作表CZ个程序,q个E序?以是scriptQ也可以是transationQ也可以是几个子E序。在例子1中,验,在购物R中增加一本书Q显C递送状态,都可以是一?Transation Script?br> Domain Model是要建立对应领域名词的模型,例如?中的书、购物R{。检验、计等处理都放到领域模型中?br> Transation Script属于l构性思维QDomain Model属于OO思维。Domain Model比较难用,一旦习惯,你能够组l更复杂的逻辑Q你的思想会更OO。到时候,即是小的系l,你也会自然的使用Domain Model了?br> 但如何抉择呢Q如果逻辑复杂Q那肯定用Domain ModelQ如果只需要存取数据库Q那Transation Script会好一些。但是需求是在不断进化的Q你很难保证以后的需求还会如此简单。如果你的团队不善于使用Domain ModelQ那你需要权衡一下投入出比。另外,即是Transation ScriptQ也可以做到把逻辑和基架构分开Q你可以使用Gateway?br> 对例2Q毫无疑问要使用Domain Model。对?需要权衡了。而对于例3Q你很难说它来会不会像?那样Q你现在可以使用Transation ScriptQ但未来你可能要使用Domain Model。所以说Q架构的决策是至关紧要的?br> 除了q两U模式,q有其它中庸的模式。Use Case Controller是处于两者之间。只有和单个的用例相关的业务逻辑才放到对象中。所以大致上他们q是在用Transation ScriptQ而Domain Model只是Database Gateway的一l集合而已。我不太用这U模式?br> Table Module是另一个中庸模式。很多的GUI环境依托于SQL查询的返回结果。你可以建立内存中的对象Q来把GUI和数据库分开来。ؓ每个表写一个模块,因此每一行都需要关键字变量来识别每一个实例?br> Table Module适用于很多的lg构徏于一个通用关系型数据库之上Q而且领域逻辑不太复杂的情cMicrosoft COM 环境Q以及它的带ADO.NET?NET环境都适合使用q种模式。而对于JavaQ就不太适用了?br> 领域逻辑的一个问题是领域对象非常的臃ѝ因为对象的行ؓ太多了,cM太大了。它必须是一个超集。这p考虑哪些行ؓ是通用的,哪些不是Q可以由其它的类来处理,可能是Use Case ControllerQ也可能是表C层?br> q有一个问题,复制。他会导致复杂和不一致。这比臃肿的危害更大。所以,宁可臃肿Q也不要复制。等到臃肿ؓx再处理它吧?br>选择一个地方运行领域逻辑
我们的精力集中在逻辑层上。领域逻辑要么q行在Client上,要么q行在Server上?br> 比较单的做法是全部集中在Server上。这样你需要用html的前端以及web server。这样做的好处是升和维护都非常的简单,你也不用考虑桌面q_和Server的同步问题,也不用考虑桌面q_的其它Y件的兼容问题?br> q行在Client适合于要求快速反应和没有联网的情c在Server端的逻辑Q用L一个再的hQ也需要信息从Client到Serverl一圈。反应的速度必然慢。再_|络的覆盖程度也不是说达C100Q?br>对于各个层来_又是怎么L呢?
基础架构层:一般都是在Server啦,不过有时候也会把数据复制到合适的高性能桌面机,但这是就要考虑同步的问题了?br> 表示层在何处q行取决于用L面的设计。一个Windows界面只能在Clientq行。而一个Web界面是在Serverq行。也有特别的例子Q在桌面Zq行web server的,例如X Server。但q种情况的多?br> 在例1中,没有更多的选择了,只能选在Server端。因此你的每一个bit都会l一个大圈子。ؓ了提高效率,量使用一些纯html脚本?br> Z选用Windows界面的原因主要就是需要执行一些非常复杂的dQ需要一个合适的应用E序Q而web GUI则无法胜仅R这是?的做法。不q,Z应该会渐渐适应web GUIQ而web GUI的功能也会越来越强大?br> 剩下的是领域逻辑。你可以全部攑֜ServerQ也可以全部攑֜ClientQ或是两辚w放?br> 如果是在Client端,你可以考虑全部逻辑都放在Client端,q样臛_保证所有的逻辑都在一个地斏V而把web serverU至ClientQ是可以解决没有联网的问题,但对反应旉不会有多大的帮助。你q是可以把逻辑和表C层分离开来。当Ӟ你需要额外的升和维护的工作?br> 在Client和Server端都h逻辑q不是一个好的处理办法。但是对于那些仅有一些领域逻辑的情冉|适用的。有一个小H门Q把那些和系l的其它部分没有联系的逻辑装h?领域逻辑的接?br> 你的Server上有一些领域逻辑Q要和Client通信Q你应该有什么样的接口呢Q要么是一个http接口Q要么是一个OO接口?br> http接口适用于web browserQ就是说你要选择一个html的表C层。最q的新技术就是web serviceQ通过Zhttp、特别是XMLq行通信。XML有几个好处:通信量大Q结构好Q仅需一ơ的回\。这栯E调用的的开销小了。同ӞXMLq是一个标准,支持q_异构。XML又是Z文本的,能够通过防火墙?br> 虽然XML有那么多的好处,不过一个OO的接口还是有它的价值的。hhtp的接口不明显Q不Ҏ看清楚数据是如何处理的。而OO的接口的Ҏ带有变量和名字,Ҏ看出处理的过E。当Ӟ它无法通过防火墙,但可以提供安全和事务之类的控制?br> 最好的q是取二者所ѝOO接口在下Qhttp接口在上。但q样做就会得实现机刉常的复杂?br>Part 3 l织web Server
很多使用html方式的hQƈ不能真正理解q种方式的优炏V我们有各种各样好用的工P但是却搞到让E序难以l护?br> 在web server上组l程序的方式大致可以分ؓ两种Q脚本和server page?br> 脚本方式是一个程序,用函数和Ҏ来处理http调用。例如CGI脚本和java servlet。它和普通的E序q没有什么两栗它从web面上获得html string形态的数据Q有时候还要做一些表辑ּ匚wQ这正是perl能够成ؓCGI脚本的常用语a的原因。而java servelet则是把这U分析留l程序员Q但它允许程序员通过关键字接口来讉K信息Q这样就会少一些表辑ּ的判断。这U格式的web server输出是另一Uhtml stringQ称为responseQ可以通过数据来操作?br> p糕的是数据是非常ȝ的,因此导致了server page的生,例如PHPQASPQJSP?br> server page的方式适合回应QresponseQ的处理比较单的情况。例如“显C歌曲的明细”,但是你的决策取决于输入的时候,׃比较杂ؕ。例如“通俗和摇滚的昄格式不同”?br> 脚步擅长于处理用户交互,server page擅长于处理格式化回应信息。所以很自然的就会采用脚本处理请求的交互Q用server page处理回应的格式化。这其实是著名的MVCQModel View ControllerQ模式中的view/controller的处理?br> 应用Model View Controller模式首要的一点就是模型要和web服务完全分离开来。用Transaction Script或Domain Model模式来封装处理流E?br> 接下来,我们把剩余的模式归入两cL式中Q属于Controller的模式,以及属于View的模式?br>View模式
Viewq边有三U模式:Transform ViewQTemplate View和Two Step View。Transform View和Template View的处理只有一步,领域数据{换ؓhtml。Two Step View要经q两步的处理Q第一步把领域数据转换为逻辑表示形式Q第二步把逻辑表示转换为html?br> 两步处理的好处是可以逻辑集中于一处,如果只有一步,变化发生Ӟ你就需要修Ҏ一个屏q。但q需要你有一个很好的逻辑屏幕l构。如果一个web应用有很多的前端用户Ӟ两步处理q别的好用。例如航I系l。用不同的W二步处理,可以获得不同的逻辑屏幕?br> 使用单步Ҏ有两个可选的模式QTemplate ViewQTransform View。Template View其时是把代码嵌入到html面中,像现在的server page技术,如ASPQPHPQJSP。这U模式灵z,强大Q但昑־杂ؕ无章。如果你能够把逻辑E序逻辑在页面结构之外进行很好的l织Q这U模式还是有它的优点的?br> Transform View使用译方式。例如XSLT。如果你的领域数据是用XML处理的,那这U模式就特别的好用?br>Controller模式
Controller有两U模式。一般我们会Ҏ动作来决定一Ҏ制。动作可能是一个按钮或链接。所q种模式是Action Controller模式?br> Front Controller更进一步,它把httph的处理和处理逻辑分离开来。一般是只有一个web handle来处理所有的h。你的所有的httph的处理都׃个对象来负责。你改变动作l构的媄响就会降到最?/p>