Figure 3. The structure of a domain model: small classes that have state and behavior
面向对象设计有许多的好处,包括可以提高可维护性和可延展性。你可以用EJB2的实体bean来实现一个简
单的对象模型。但是如果像要获得更多的好处的话,必须要使用POJOs技术和轻量级持久层构架——比如
Hibernate和JDO技术。POJO可以让你开发丰富的模型,这些模型可以拥有继承和回调等特点。而轻量级
持久层构架可以让你很简单的从对象模型映射到数据库。
对象模型的另外一个名字是域模型,Fowler称这种由面向对象途径来开发的业务逻辑叫做域模型设计模
式。(就是类的设计是直接用来解决问题的,则这种设计模式叫做域模型设计模式)
表模型设计模式
我曾经一直用域模型和事务处理脚本模型设计应用程序。但是有一次我听说JAVA企业应用程序可以用第三
种途径来实现,这种途径就是Fowler所说的表模型设计模式。这种模式比事务处理脚本模式更加的结构
化,因为它为数据库中的每个表都写了一个类,而这个类中实现了所有对这个表的操作代码,这个类就是
表模型类。(我的解释就是为每个表专门写个类,对表的所有操作,全都由这个类中的方法实现,相当于
用一个类模拟的数据库中的表)。和事务处理脚本模式相比,它将数据和行为分别封装到了不同的类中,
因为表模型类的实例相当于真实数据库中的数据,这当然要比单独的一条记录要好的多。最后,可维护性
成了问题,然而表模型设计模式还是有一些好处的。
决策决策2:封装业务逻辑:封装业务逻辑
前面几章,我没有提及如何组织业务逻辑。你必须决定业务逻辑有什么样的接口。业务逻辑的接口由一些
数据和方法组成,这些数据和方法由表示层来调用。在设计接口时重点需要考虑的是:应该封装哪些业务
逻辑的操作,而哪些操作不应该显示给表示层。封装接口可以提高程序的可维护性,因为通过隐藏业务逻
辑的操作细节,可以实现修改业务逻辑而不影响表示层。缺点是,你必须为封装业务逻辑而特意的写很多
的代码。
你还需要考虑其他重要的问题,比如如何处理事务处理,安全,和远程调用问题。通常这些也是业务逻辑
接口要负责的问题。为了保证数据的连贯性,业务层的接口必须保证每个事务处理中的调用都能执行。同
样,也要验证调用者是否有权限调用业务方法。业务层接口还要负责处理一些远程客户端的问题。
来考虑一下选项。
EJB session faç;;ade
经典的J2EE解决方案是:用EJB来封装业务逻辑-基本的session facade.EJB容器提供事务处理管理,安
全,分布式事务处理和远程访问。Facade方式可以通过封装业务逻辑来提高程序可维护性。粗糙型
(Coarse-grained) API通过减少表示层对业务层的访问次数,而提高性能(因为它将对各个业务流程的处
理再封装了一次,所以对底层的业务流程来说,它的API是比较粗糙的,这里也许翻译的不好。请大家见
谅)。因为减少调用的次数,可以减少对数据库事务处理的次数,还可以提高对象在缓冲区的机会。如果
表示层通过远程访问业务层,则这种API还可以减少网络负担。图表4给出了一个EJB-based session
facade的例子。