业务层设计之三(SessionFacade)

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