﻿<?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-Study &amp; Summary -随笔分类-模式</title><link>http://www.blogjava.net/wfeng007/category/6240.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:29:45 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:29:45 GMT</pubDate><ttl>60</ttl><item><title>表模块模式（Table Module）</title><link>http://www.blogjava.net/wfeng007/archive/2006/03/13/35021.html</link><dc:creator>wfeng007</dc:creator><author>wfeng007</author><pubDate>Mon, 13 Mar 2006 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/wfeng007/archive/2006/03/13/35021.html</guid><wfw:comment>http://www.blogjava.net/wfeng007/comments/35021.html</wfw:comment><comments>http://www.blogjava.net/wfeng007/archive/2006/03/13/35021.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wfeng007/comments/commentRss/35021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wfeng007/services/trackbacks/35021.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span lang="EN-US"><span style=""></span></span><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; (大量参考PoEAA...-_-...)</span></p><p class="MsoNormal"><span style="font-family: 宋体;"><br></span></p><p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 最近网上看到这样的帖子</span><span lang="EN-US">&lt;&lt;</span><span style="font-family: 宋体;">谁能告诉我</span><span lang="EN-US">Hibernate</span><span style="font-family: 宋体;">有何优秀之处</span><span lang="EN-US">&gt;&gt; </span><span style="font-family: 宋体;">作者给出了对</span><span lang="EN-US">hibernate</span><span style="font-family: 宋体;">在实现</span><span lang="EN-US">orm</span><span style="font-family: 宋体;">的诸多不满和怀疑。而且很多开发人员都有着这样疑问，“怎么这个流行东东，我用起来就是不顺手呢？</span><span lang="EN-US">”</span><span style="font-family: 宋体;">，“或许这个东东只是用来吹牛的</span><span lang="EN-US">…</span><span style="font-family: 宋体;">”。然而，这或许很可能是因为，你习惯的架构模式开发策略并不适合使用</span><span lang="EN-US">orm</span><span style="font-family: 宋体;">这种持久化模式。用了反而是加大复杂度降低性能和效率。比如，用惯了</span><span lang="EN-US">resultset</span><span style="font-family: 宋体;">，喜欢把</span><span lang="EN-US">resultset</span><span style="font-family: 宋体;">放在表示层作为展示的数据结构的人。这样的开发人员因为习惯了二维表为核心进行开发，对于</span><span lang="EN-US">Hibernate</span><span style="font-family: 宋体;">这样的</span><span lang="EN-US">orm</span><span style="font-family: 宋体;">工具根本就没办法了解其优势了。但是这并不是说这种以二维表的架构模式就比较差了，只是不同的模式有不同的优缺点就看所在的应用是否适合使用了。或许你就一直在使用这样的模式在开发应用，自己还没有意识到（甚至一直以为这样的方式可以适应任何应用，</span><span lang="EN-US">:-</span><span style="font-family: 宋体;">）。反而被其他架构模式中才会用到的框架搞的晕头转向甚至被误导。事实上，像前面提到的以二维表为核心的架构被称之为</span><span lang="EN-US">”</span><span style="font-family: 宋体;">表模块</span><span lang="EN-US">”</span><span style="font-family: 宋体;">架构</span><span lang="EN-US">(</span><span style="font-family: 宋体;">设计</span><span lang="EN-US">)</span><span style="font-family: 宋体;">模式。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">何为“表模块”</span><span lang="EN-US">(table module)</span><span style="font-family: 宋体;">？“处理某一个数据库表、视图或虚拟表中所有行为的业务逻辑组成的一个实例”。最初，我就是从马丁同学的</span><span lang="EN-US">POEAA</span><span style="font-family: 宋体;">中得到的这个定义。在书中他被定义在</span><span lang="EN-US">DomainLogic </span><span style="font-family: 宋体;">层次或者该层次的一部分，</span><span lang="EN-US">DomainLogic</span><span style="font-family: 宋体;">也就是其他架构模型中的</span><span lang="EN-US">BizLogic</span><span style="font-family: 宋体;">层。与该模式相对应个还有完成相似功能的</span><span lang="EN-US">DomainModel</span><span style="font-family: 宋体;">以及</span><span lang="EN-US">TransactionScript</span><span style="font-family: 宋体;">模式。该层次的职责是专门处理业务逻辑。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">简单的讲，所谓“表模块”就是以一个类对应数据库中一个表（视图）的数据来组织业务逻辑。从设计层次表妙面上看这种结构很像经典</span><span lang="EN-US">OO</span><span style="font-family: 宋体;">模型，同样是以不同对象对应不同逻辑。但是，它与领域建模不同之处在于，它的对象并不表示一个问题领域对象在软件系统中的映射。而是表示对一组数据的处理逻辑，而通常这组数据的结构是重数据库表或试图上的二维数据结构。当然也可以来自其他集成部分，比如返回两位数据结构的</span><span lang="EN-US">webservice</span><span style="font-family: 宋体;">。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">这里给出个比较形象的例子：</span></p>

<p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US"><!--[if gte vml 1]><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:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:223.5pt;
 height:95.25pt'>
 <v:imagedata src="file:///C:\DOCUME~1\wfeng007\LOCALS~1\Temp\msohtml1\01\clip_image001.emz"
  o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/wfeng007/pattern/oo.jpg"><br><!--[endif]--></span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">（上图）感觉像比较标准的</span><span lang="EN-US">OO</span><span style="font-family: 宋体;">吧，好象一个</span><span lang="EN-US">Contract</span><span style="font-family: 宋体;">的对象表示合同，而</span><span lang="EN-US">Product</span><span style="font-family: 宋体;">表示产品，还有他们之间的关联关系。但是其实现实给出几个方法的时候就看出区别了。</span><span lang="EN-US">Product</span><span style="font-family: 宋体;">内部的数据其实就是一个两位结构的</span><span lang="EN-US">rowset</span><span style="font-family: 宋体;">。而不像真正的领域模型分析出来的表示一个</span><span lang="EN-US">Product</span><span style="font-family: 宋体;">的数据，</span><span lang="EN-US">Contract</span><span style="font-family: 宋体;">也是如此。</span></p>

<p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US"><!--[if gte vml 1]><v:shape
 id="_x0000_i1026" type="#_x0000_t75" style='width:338.25pt;height:150.75pt'>
 <v:imagedata src="file:///C:\DOCUME~1\wfeng007\LOCALS~1\Temp\msohtml1\01\clip_image003.emz"
  o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/wfeng007/pattern/tableModule.jpg"><br><!--[endif]--></span></p>



<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">你会发现</span><span lang="EN-US">tableModule</span><span style="font-family: 宋体;">的类中一个对象其实对应一个表的数据，其拥有的操作也有很多是多数据记录的。多数据记录的操作在真正的领域中往往应该放在类似</span><span lang="EN-US">Manager</span><span style="font-family: 宋体;">这样的实体中，而不是业务实体本身。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">使用这种模式实现的业务逻辑层不像领域模型模式可以适应搞复杂度的逻辑。但是由于它更亲近于数据持久的二维表，没有像领域模型那样需要复杂的</span><span lang="EN-US">ORM</span><span style="font-family: 宋体;">支持。书对于数据驱动的应用或模块非常适合。</span><span lang="EN-US">POEAA</span><span style="font-family: 宋体;">中也已经给出了这种</span><span lang="EN-US">bizLogic</span><span style="font-family: 宋体;">最有效的持久层实现，就是</span><span lang="EN-US">table getway</span><span style="font-family: 宋体;">，当然也可以使用其他的方式比如“查询工厂”。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">事实上，最多使用这种模式的情况是当后台数据源大部分都是一种两维甚至多维数据结构的时候进行。比如一个极端的例子（几乎没有业务），一个应用的复杂查询模块，这种模块就是一个查询模型加上一组对数据进行排列统计过滤的</span><span lang="EN-US">TableModule</span><span style="font-family: 宋体;">。</span></p>

<div align="center"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<img src="http://www.blogjava.net/images/blogjava_net/wfeng007/pattern/tableModule_Meta.JPG">  </span></span></div><p class="MsoNormal"><span lang="EN-US"><!--[if gte vml 1]><v:shape
 id="_x0000_i1027" type="#_x0000_t75" style='width:291.75pt;height:194.25pt'>
 <v:imagedata src="file:///C:\DOCUME~1\wfeng007\LOCALS~1\Temp\msohtml1\01\clip_image005.emz"
  o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><b style=""><span style="font-family: 宋体;">表模块还具有很多特点</span></b><span style="font-family: 宋体;">：处理的二维数据表将成为代码的核心部分。所以，是否使用</span><span lang="EN-US">tableModule</span><span style="font-family: 宋体;">还会取决于整个应用的其他部分是否对这种二维表提供强大的支持。（如上图）</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><b style=""><span style="font-family: 宋体;">优点：</span></b><span style="font-family: 宋体;">持久层架构简单，在复杂度大的以数据为核心的应用中开发效率极高。而且表模块能够识别的</span><span lang="EN-US">table</span><span style="font-family: 宋体;">越多，能够处理</span><span lang="EN-US">table</span><span style="font-family: 宋体;">的组建工具越强，这种模型的能力越强。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><b style=""><span style="font-family: 宋体;">缺点：</span></b><span style="font-family: 宋体;">不能适应复杂的应用逻辑，或者与表结构差别较大的应用逻辑。由于没有对内部的两位数据表（</span><span lang="EN-US">table</span><span style="font-family: 宋体;">）进行有效标识的方式（比如，无法快速简单的确定使用</span><span lang="EN-US">table</span><span style="font-family: 宋体;">是否是需要的数据内容），对于大量细颗粒的逻辑会增加其复杂度。</span></p>

<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">其实</span><span lang="EN-US">java</span><span style="font-family: 宋体;">中的</span><span lang="EN-US"> rowset/jdbc resultset</span><span style="font-family: 宋体;">，</span><span lang="EN-US">.net</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">
dateSet/dataTable</span><span style="font-family: 宋体;">都属于表模块操作的二维表。但是，由于</span><span lang="EN-US">.net</span><span style="font-family: 宋体;">在</span><span lang="EN-US">GUI</span><span style="font-family: 宋体;">层面以及持久化层面对他自己的</span><span lang="EN-US">”</span><span style="font-family: 宋体;">二维表</span><span lang="EN-US">”</span><span style="font-family: 宋体;">的强大支持使得</span><span lang="EN-US"> TableModule</span><span style="font-family: 宋体;">几乎成为</span><span lang="EN-US">MS.Net</span><span style="font-family: 宋体;">上的首选模式。这也就可以解释了，许多</span><span lang="EN-US">.net</span><span style="font-family: 宋体;">开发人员一直抱怨，看到</span><span lang="EN-US">dataset/dataTable</span><span style="font-family: 宋体;">泛滥，甚至在</span><span lang="EN-US">WebService</span><span style="font-family: 宋体;">中也是这样。而</span><span lang="EN-US">java</span><span style="font-family: 宋体;">中却有所不同，虽然有持久化用到的</span><span lang="EN-US">jdbc/resultSet</span><span style="font-family: 宋体;">的支持（事实上</span><span lang="EN-US">jdbc/ado </span><span style="font-family: 宋体;">给出的接口都只直接适合</span><span lang="EN-US">TableModule</span><span style="font-family: 宋体;">。），然而其他方面就少得可怜了。所以，使用</span><span lang="EN-US">java</span><span style="font-family: 宋体;">还是以其他的</span><span lang="EN-US">bizLogic</span><span style="font-family: 宋体;">架构模式为好。除非你的逻辑真的很简单，简单到把</span><span lang="EN-US">resultSet</span><span style="font-family: 宋体;">放在</span><span lang="EN-US">jsp</span><span style="font-family: 宋体;">中都不会造成逻辑混乱。又或者你能够自己提供一套完整的</span><span lang="EN-US"> rowset</span><span style="font-family: 宋体;">组建框架。</span></p>

<img src ="http://www.blogjava.net/wfeng007/aggbug/35021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wfeng007/" target="_blank">wfeng007</a> 2006-03-13 14:08 <a href="http://www.blogjava.net/wfeng007/archive/2006/03/13/35021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>锁模式</title><link>http://www.blogjava.net/wfeng007/archive/2006/01/10/27411.html</link><dc:creator>wfeng007</dc:creator><author>wfeng007</author><pubDate>Tue, 10 Jan 2006 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/wfeng007/archive/2006/01/10/27411.html</guid><wfw:comment>http://www.blogjava.net/wfeng007/comments/27411.html</wfw:comment><comments>http://www.blogjava.net/wfeng007/archive/2006/01/10/27411.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wfeng007/comments/commentRss/27411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wfeng007/services/trackbacks/27411.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:         在事务系统中很重要的一个概念就是“锁”。在事务系统中“事务”概念保证了数据访问的原子性，即单事务进程中一组数据访问的一致性，而“锁”的概念保证了数据访问的隔离性与排他性，即并发事务进程之间的同步访问的独立性。&nbsp;&nbsp;<a href='http://www.blogjava.net/wfeng007/archive/2006/01/10/27411.html'>阅读全文</a><img src ="http://www.blogjava.net/wfeng007/aggbug/27411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wfeng007/" target="_blank">wfeng007</a> 2006-01-10 16:13 <a href="http://www.blogjava.net/wfeng007/archive/2006/01/10/27411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式定义归纳</title><link>http://www.blogjava.net/wfeng007/archive/2005/12/22/25036.html</link><dc:creator>wfeng007</dc:creator><author>wfeng007</author><pubDate>Thu, 22 Dec 2005 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/wfeng007/archive/2005/12/22/25036.html</guid><wfw:comment>http://www.blogjava.net/wfeng007/comments/25036.html</wfw:comment><comments>http://www.blogjava.net/wfeng007/archive/2005/12/22/25036.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/wfeng007/comments/commentRss/25036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wfeng007/services/trackbacks/25036.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 模式的定义，似乎都如出一辙但又似乎都略有不同，这些由于关注点的不同导致的不同点让事情变得有点复杂了。&nbsp;&nbsp;<a href='http://www.blogjava.net/wfeng007/archive/2005/12/22/25036.html'>阅读全文</a><img src ="http://www.blogjava.net/wfeng007/aggbug/25036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wfeng007/" target="_blank">wfeng007</a> 2005-12-22 10:59 <a href="http://www.blogjava.net/wfeng007/archive/2005/12/22/25036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>