系统设计与建模


J2EE核心模式 - Business Delegate(业务代理)

2008-01-07 21:11Update
TAGS: Core | J2EE | Pattern

LifevV.COM编辑部

Business Delegate模式又称业务代理模式,它建议在多层分布式的应用中,在表示层和逻辑业务处理层之间增加一个代理层,通过该代理层,隐藏业务处理层的实现细节以及实现对业务逻辑的透明调用。


Business Delegate模式介绍
我们从问题,解决方法,策略,优点等几个方面介绍Business Delegate模式。最后给出Business Delegate的相关联结。

问题


在分布式的多层应用系统中,需要进行远程方法调用以及跨层数据接收。表示层组件如果直接与远程业务逻辑处理组件交互,将存在以下问题:
-    业务逻辑处理层的实现细节将暴露给表示层组件,这样,一旦业务层的实现方法发生改变,表示层组件的代码也不得不跟着改变。比如业务逻辑的实现由EJB2.0改由EJB3.0实现的时候。
-    当表示层组件与业务逻辑处理组件分别位于不同的网络环境中时,直接访问或调用将引起过多的网络访问,影响系统的执行效率。
-    服务逻辑处理层的API的开放将导致表示层组件紧密依靠特定的技术实现比如EJB。

解决方法


Use a Business Delegate to reduce coupling between presentation-tier clients and business services. The Business Delegate hides the underlying implementation details of the business service, such as lookup and access details of the EJB architecture.

使用Business Delegate(业务代理)来减少表示层与业务逻辑层之间的耦合性,通过Business Delegate隐藏业务逻辑层的实现细节比如lookup以及对EJB的访问细节等,或者其他处理比如对数据或操作的缓存等。

Business Delegate模式结构图:


Client通过BusinessDelegate访问BusinessService,BusinessDelegate可以使用LookupService等查找或创建BusinessService。

策略


Business Delegate模式有多种实现策略:
Delegate Proxy Strategy
    Delegate Business通过Proxy模式实现。参考文末联结。
Delegate Adapter Strategy
    Delegate Business通过Adapter模式实现。参考文末联结。

优点:


使用Business Delegate模式有以下好处:
- 减少表示层与业务逻辑层之间的耦合性。Delegate Business隐藏了业务逻辑层的实现细节,表示层可以通过Delegate Business透明地访问业务逻辑层组件。
- 集中控制管理能力。表示层对业务逻辑层的访问集中在Delegate Business里进行,一旦业务逻辑发生变化,只需集中修改Delegate Business即可,不会影响表示层代码。
- 错误接管与转换能力。Delegate Business可以catch来自业务逻辑层的网络异常等,并将其转换为表示层易理解的business异常。
- 因为Delegate Business的集中管理,可以在Delegate Business里做一些诸如缓存,线程同步等共通处理。
- 隐藏远程调用远层实现等细节。
- 具有对表示层更友好的接口。Delegate Business可以根据需要,提供给表示层更友好的接口。

Business Delegate例:


下面举例说明Business Delegate。当然,这个例子只列出了大致的框架,并不能真正地运行。

比如,我们要调用的业务层逻辑具有以下接口形式:
public interface IOrderBook {
    public boolean order(String bookId);
    public boolean cancel(String bookId);
}


它采用EJB2.0实现(实现代码略)。
如果在表示层的组件里(JSP,SERVLET,或View Helper等)直接调用OrderBook EJB组件,则需要在各客户端代码里分别写对该EJB组件的lookup代码,这样不但暴露了OrderBook的实现细节,也使得表示层中的各个组件严重依赖EJB2.0技术。这样的代码产生的问题上面已经作了详细描述。

使用Business Delegate模式,其实现方法一例:
import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.naming.NamingException;

public class OrderBookDelegate implements IOrderBook {
    IOrderBook orderBook = null;
    
    public OrderBookDelegate() {
        init();
    }
    
    private void init() {
        try {
            // ServiceLocator的代码这里没给出代码,大家可以自己实现
            OrderBookHome home = ServiceLocator.getInstance().getHome("java:comp/env/ejb/OrderBookHome", OrderBookHome.class);
            orderBook = home.create();
        } catch (NamingException e) {
            throw new MyBusinessException(e);
        } catch (CreateException e) {
            throw new MyBusinessException(e);
        } catch (RemoteException e) {
            throw new MyBusinessException(e);
        }
    }
    
    public boolean order(String bookId) {
        return orderBook.order(bookId);
    }

    public boolean cancel(String bookId) {
        return orderBook.cancel(bookId);
    }
    
}

init()方法调用了ServiceLocator来创建/查找OrderBook。这里没给出具体的实现代码。
OrderBookDelegate实现了IOrderBook接口,客户端对它的调用可以通过下面的方法:

        IOrderBook orderBook = new OrderBookDelegate();
        orderBook.order("mybook");

利用这种方法,可以完全除去表示层对业务逻辑层(EJB技术等)的依赖,不管业务逻辑层使用EJB2.0,亦或是EJB3.0,Hibernate,JDO,JDBC等,表示层可以完全不受影响。

相关模式


Service Locator模式
    Business Delegate可以使用Service Locator模式来查找/访问业务逻辑组件。
Proxy [GoF]
    GoF代理模式,可以通过Proxy模式来实现Delegate Business。
Adapter [GoF]
    GoF适配器模式,可以通过Adapter模式来实现Delegate Business。
Broker [POSA1]
      Business Delegate担当打破业务逻辑层组件与其它层客户端组件的耦合性关系这样一种角色。

参考资料:

Core J2EE Pattern Catalog
Core J2EE Patterns - Business Delegate
 
Copyright ©2006-2010 lifevv.com. All Rights Reserved
POWERED BY @pmplat.syboos.com