业务层设计之五(BusinessObject)

来源:百度文库 编辑:神马文学网 时间:2024/04/27 19:29:24
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();
}
}