日期:2014-05-19  浏览次数:20681 次

J2EE业务层模式--业务对象
问题:

     有一个业务领域概念模型,其中包括了业务逻辑和关系。

如果业务操作只有很少、什么没有业务逻辑,那么应用系统通常会让客户端直接访问数据存储中的业务数据。比如说,一个表现层组件(比如一个命令助手或者一个JSP视图)或者一个业务层组件,都可能直接访问一个数据访问对象。在这种情况之下,业务层中就没有“对象模型”的概念了。应用需求有一个面向过程的实现完成。如果在应用系统中,数据模型和业务领域概念模型特别的接近,那么采取这种做法是可以接受的。但是如果概念模型包含了多种业务功能和关系,那么使用面向过程的方式实现应用系统就会导致一下问题:

--降低了可重用性,业务逻辑代码发生了重复

--面向过程的系统实现变得很臃肿,既冗长又复杂。

--系统可维护性低,因为代码的重复的地方很多,而且业务逻辑分散在不同的模块中。

约束:

--概念模型包含了结构化、相互关联的复合对象

--概念模型包含包含了复杂的业务逻辑、验证和业务规则

--把业务状态和业务功能同系统的其他部分区分开,增进系统的内聚和可重用性

--集中应用系统中的业务逻辑和业务状态

--提高业务逻辑的可重用性,避免代码重复。



解决方案:

  使用业务对象,利用对象模型吧业务数据和业务逻辑分离出来。

  业务对象负责封装并管理业务数据、业务功能和持久化机制。业务对象有助于把持久化机制从业务逻辑中区分开来。业务对象负责维护核心的业务数据、并且实现在整个应用系统或业务领域中通用的一些功能。

    在一个使用了业务对象的应用系统中,客户端与业务对象交互,而后者则可以使用多种持久化化策略管理自身的持久化机制。业务对象实现了一个可重用的业务实体层,该层描述了特定的业务领域。一个业务对象实现了一种定义完备的业务领域概念,并且还包含了一些适用于该概念的业务逻辑和业务规则。至于一些高层次的业务逻辑或者作用于多个业务对象的外在业务逻辑,则由一个服务层通过应用服务和会话门面实现,这样也就能吧对象模型和客户端隔离开来,避免了直接访问。

    实现业务对象,主要有两种策略。每种策略中要创建的对象类型、实现的持久化机制不同。

--第一种策略是使用POJO。并且选择一种适合需要的持久化机制。可以从以下机制中选择:定制数据访问对象、用业务领域存储实现JDO形式的定制持久化框架、标准JDO实现。

--第二种策略是按照符合实体模式中的做法是用entity bean。使用这个策略还是决定是使用BMP或者CMP完成持久化。

   另外对于这两种策略,在实现业务对象时都要考虑安全性、事务管理、池、缓存、并行处理等需求。

   有些较为简单的应用系统可能会把业务对象暴露给所有的客户端,这样访问业务对象会直接导致细粒度的交互。如果这是一个POJO应用程序,客户端和业务对象都处于同一虚拟机的进程空间里,那么这种做法还可以行得通;但是对于远程应用系统来说,这种实现方式可能就是低效率和缺乏一致性。对于比较复杂的应用系统,就不应该把业务对象暴露给所有的客户端,而应该使用服务门面和POJO应用服务封装业务对象。

对于远程应用程序,就应该使用会话门面,构成一个远程服务门面、业务对象通过这个门面暴露给客户端。这样,就不会吧业务对象返回给业务层之外的客户端;二是使用传输对象在客户端和业务对象之间交换数据。

  确定、设计业务对象,并为之提供持久化机制,这是一种复杂的工作,常常要花费相当的时间和资源。以下部分讨论了怎么确定业务对象,以及怎么样选择合适的持久化机制。

  当我们找到了所有的业务对象,那么就应该确定如何存储数据了。业务对象有助于把持久化存储逻辑从业务逻辑分离出来。既然几乎所有的业务对象都需要持久化机制,那么就需要某种持久化机制,把对象状态映射到一种数据存储中。一种做法是使用业务领域存储提供一种框架为业务对象实现透明的持久化。

   虽然可以直接在业务对象里面编码实现是持久化,我们还是建议不要这么去做,因为这样就会把持久化逻辑和业务对象混合在了一起,最后导致业务层和持久化存储层的组件之间产生紧耦合。吧系统中两种不相关的内容混合在一起,降低系统的内聚性、模块化程度和可维护性。而且,业务对象模型的主要目的在于为业务状态和业务功能建模。随着业务模型想复杂方向发展,吧持久化存储逻辑放在业务对象中就会是代码难以维护,是对象模型和数据模型产生紧耦合。

设计手记:

业务对象的一个核心特征,就是他代表着持久化的业务信息。可以通过不同方式实现持久化。

--使用实体bean持久化

--使用定制数据访问对象

--使用JAVA数据对象JDO

--使用业务领域存储

@使用实体bean持久化,可以按照复合实体模式中介绍的方式,使用实体bean实现业务对象。对于实体bean来说,还可以选择的是BEP和CMP实现持久化,如果选择了BMP。那么通常就要用到数据访问对象。