分享

业务层设计之五(BusinessObject)

 ljjzlm 2006-08-01
业务层设计之五(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();
        }
    }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多