业务层设计之三(SessionFacade)

来源:百度文库 编辑:神马文学网 时间:2024/04/28 17:19:32
业务层设计之三(SessionFacade) Session Facade(会话门面)   问题       需要把业务组件和业务服务暴露给远程客户端。     1. 客户端和业务组件之间存在紧耦合,导致了两个层次之间直接的依赖关系。     2. 客户端包含寻址,事务,安全管理,业务处理,加大了客户端的复杂度和责任。     3. 多种类客户端导致对通用业务组件的用法不一致,降低了系统可维护性和灵活性。     4. 远程客户端访问细粒度的组件,降低了系统的网络性能。   动机       1. 避免客户端直接访问业务组件,从而防止客户端和业务层之间出现紧耦合。     2. 需要给业务对象和其他业务层组件提供一个远程访问层。     3. 需要聚合应用服务和其他服务,并把他们暴露给远程客户端。     4. 需要把所有需要暴露给远程客户端的业务逻辑集中,聚合起来。     5. 隐藏业务组件和业务服务间复杂的交互和依赖关系,提高灵活性。     结构       Client ----> SessionFacade ----> BusinessComponent(ApplicationService,BO,DAO)       客户端: Client需要访问业务层,通常是另一个层次中的业务代表。       会话门面: SessionFacade以SessionBean的形式实现(stateful,stateless).它隐藏了参与         用例的多个BusinessComponent(业务组件)交互的复杂性,因此就能给Client提供一         种高层次的,粗粒度的远程服务抽象。       业务组件: BusinessComponent参与完成客户端的请求。业务组件可能实现为业务对象         (BusinessObject),或者也可能实现为应用服务(POJO)。         应用服务: ApplicationService封装了BO(业务对象),且实现了一些业务逻辑,完成服务请         求。SessionFacade为了完成一次请求,可能要与多个ApplicationService对象交互。       数据访问对象: 采用SessionFacade调用DataAccessObject(DAO)这种做法的都是一些         在业务层不需要业务对象层的小型应用系统。   示例       在PetStore 中就使用了这种模式,不过大家一般在开发中都可能使用这种模式。       public class ShoppingClientFacadeLocalEJB implements SessionBean {
        //它封装了调用客户的EntityBean
        public CustomerLocal getCustomer() throws FinderException {
            if (userId == null) {
                throw new GeneralFailureException("userId is not set" );
            }
            try {
                InitialContext ic = new InitialContext();
                Object o = ic.lookup("java:comp/env/ejb/local/Customer");
                CustomerLocalHome home =(CustomerLocalHome)o;
                customer = home.findByPrimaryKey(userId);
            } catch (javax.naming.NamingException nx) {
                throw new GeneralFailureException(" failed to ...." + nx);
            }
            return customer;
        }
        //它封装了产生客户方法
        public CustomerLocal createCustomer(String userId) {
            try {
                InitialContext ic = new InitialContext();
                Object o = ic.lookup("java:comp/env/ejb/local/Customer");
                CustomerLocalHome home =(CustomerLocalHome)o;
                customer = home.create(userId);
                this.userId = userId;
            } catch (javax.ejb.CreateException ce) {
                throw new GeneralFailureException("failed to create customer" + ce);
            } catch (javax.naming.NamingException nx) {
                throw new GeneralFailureException("failed to look up ...." + nx);
            }
            return customer;
        }
    }