业务层设计之五(BusinessObject)

来源:百度文库 编辑:神马文学网 时间:2024/07/08 09:55:22
业务层设计之五(BusinessObject) Business Object(业务对象)   问题       有一个业务领域概念模型,其中包括业务逻辑和关系。          如果业务操作中只有很少甚至没有业务逻辑,那么应用系统通常会让Client直接访问数据     存储中的业务数据.比如说一个表现层组件或者一个业务层组件,都可能直接访问DAO.     这种情况下,业务层中就没有"对象模型"的概念了.应用需求由一个面向过程的实现完成。       但是如果概念模型包含了多种业务功能和关系,那么面向过程的这种实现方式会导致:     1. 降低了可重用性,业务逻辑代码发生了重复。      2. 面向过程的系统实现变得臃肿,即冗长又复杂。     3. 系统可维护性很低,因为代码重复多,业务逻辑分散。     术语解释       业务模型: Business Model由两种模型构成:业务用例模型描述的是业务角色和业务过         程,而业务对象模型描述的是业务用例所使用的业务实体。       业务领域模型: Domain Model定义为一种抽象模型,它固化了在系统的上下文环境中         最重要的若干对象.它代表着在系统运转的环境中存在的一些东西和发生的一些事情。       概念模型: 概念模型指的是抽象概念,它描述的是业务领域实体,实体关系以及业务规则。       对象模型: 对象模型是概念模型的一种具体的OO实现.实现概念模型所需要的类和关系。       数据模型: Data Model指的是数据实现模型,比如用于RDBMS数据库的ER模型。   动机       1. 概念模型包含结构化的,相互关联的复合对象。     2. 概念模型包含复杂的业务逻辑,验证和业务规则。     3. 把业务状态和业务功能同系统的其他部分区分开,增进系统的内聚和可重用性。     4. 集中应用系统中的业务逻辑和业务状态。     5. 提高业务逻辑的可重用性,避免代码重复。       实现业务对象,主要有两种策略(都要考虑安全性,事务管理,池,缓存,并行处理等需求)。     1. 使用POJO,且选择一种适合需要的持久化机制。如定制DAO,标准JDO实现等。     2. 使用EntityBean,使用这个策略还要决定是使用BMP(用到DAO)还是CMP来完成持久化。   结构         Client(facade,service,helper)---->ParentBO(data store)---->DependentBO(datastore)       客户端: Client代表了BO的客户端,它通常可能是服务门面,助手对象或应用服务。       父业务对象: ParentBO是顶级BO,它封装了从属对象,实现了自身内部业务逻辑和规则。       从属业务对象: DependentBO和父业务对象存在着紧耦合,依靠父对象实现生命周期管理。         从属对象不能脱离父对象独立存在。每个从属对象都要实现它自身的内部业务逻辑。   策略         POJO业务对象和EntityBean业务对象之间的功能比较:       1. 安全性: 如果由会话门面管理对POJO业务对象的所有访问,那么安全模型就能够由         EJB容器提供。如果不用EJB,就只能用定制框架,或者使用JAAS实现系统安全性。       2. 事务: 与安全性类似.不采用EJB,那么很可能就要依靠持久化策略来实现事务服务了.       3. 缓存和池: EJB容器管理EntityBean生命周期,EntityBean通常不被缓存,而是用实         例池。POJO业务对象除非实现专门的Cache技术(或者池),但是增加了应用系统的         复杂度。对单线程空间的POJO应用系统来说,实现缓存相对容易;但是对于多层         分布式的应用系统来说,同一个页       4. 并行: POJO需要使用某种锁定机制一直维持数据完整性。EJB容器管理并行请求。       5. 数据同步: 在多层应用系统中,如果不同的JVM或容器中存在着同一个业务对象的实例.         那么,就确保BO的一个实例上发生的修改要传播给所有现存的示例,保证数据同步。       6. 持久化: 用CMP和CMR或者选用BMP(自编码实现BO关系)实现定制的持久化机制。         POJO实现持久化可利用DAO,业务领域存储,JDO或者商业ORM工具等。   示例       本例示范了POJO业务对象策略.EntityBean实现业务对象策略请参考复合实体模式示例。       public class CustomerBO {           //CustomerData是数据对象         private CustomerData customerData;           //ContactInfoBO是从属业务对象         private ContactInforBO contactInforBO;           public CustomerBO(CustomerData customerData) {             //验证customerData的值             ..........              //把客户端数据复制到这个对象中                this.customerData = customerData;         }           public ContactInfoBO getContractInfoBO()  {             if (contactInfoBO == null) {                 contactInfoBO=new ContactInfoBO(customerData.getContactInfoData());             }             return contactInfoBO;         }           //CustomerBO的业务方法     }       public class ContactInfoBO {                 //ContactInfoData是数据对象         private ContactInfoData contactInfoData;           public ContactInfoBO(ContactInfoData contactInfoData) {             //validate             this.contactInfoData = contactInfoData;         }           public AddressData getAddressData() {             return contactInfoData.getAddressData();         }     }