业务层设计之三(SessionFacade)
来源:百度文库 编辑:神马文学网 时间:2024/06/06 14:08:41
业务层设计之三(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;
}
}
//它封装了调用客户的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;
}
}
业务层设计之三(SessionFacade)
业务层设计之三(SessionFacade)
业务层设计之五(BusinessObject)
业务层设计之二(ServiceLocator)
业务层设计之五(BusinessObject)
业务层设计之二(ServiceLocator)
webgis 发布简单图层之三
Scott Mitchell 的ASP.NET 2.0数据教程之二:创建一个业务逻辑层
基于CSS的DIV网页设计 - 通过浮动容器来固定层 - 三栏
基于CSS的DIV网页设计 - 使用固定层方法设计网页 - 三栏_爱上你的微笑
GoF设计模式之三 Factory Method- -
GoF设计模式之三 Factory Method- -
《蓝色的树叶》教学设计之三
招聘业务及设计人员
面向对象的应用服务层设计
高速PCB设计的叠层问题
面向对象的应用服务层设计
Sawin软件研发之窗:数据库设计经验谈(三)
Sawin软件研发之窗:数据库设计经验谈(三)
高级应用 java多线程设计模式详解之三
薪酬哲学与设计艺术(之三)
薪酬哲学与设计艺术(之三)1
Sawin软件研发之窗:数据库设计经验谈(三)
追求神乎其技的程式设计之道(三)