打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
业务层设计之一(BusinessDelegate)
Business Delegate(业务代表)
 
问题
 
    当客户端直接访问远程业务服务组件时,可能发生以下问题。
    1. 降低了系统的灵活性。客户端代码随着业务服务接口的代码的改变而改变。紧耦合。
    2. 降低了系统的网络传输性能。一个操作需要进行多次细粒度的远程交互。
    3. 客户端包含底层架构代码。包括JNDI,网络连接故障处理,重试逻辑等等。
 
动机
 
    1. 降低客户端与业务服务层的耦合度,从而隐藏服务层的具体实现细节。
    2. 把网络异常信息转译成应用程序异常,或者是用户使用异常。
    3. 业务代表可以向web 层提供请求的缓冲机制,提高性能。例如可以缓存远程接口。
    4. 当服务层发生故障时,业务代表可以透明地重试或恢复操作,无需让客户端知道。
    5. 为业务层提供一个简单,统一的接口。业务代表以一个POJO形式实现。
    6. 隐藏远程性。避免不必要的远程服务调用。位置透明性。
    7. 引入代理层。增加了复杂性,降低了可维护性。但收益远抵消了弊病。
 
结构
 
    客户端(Action) ----> 业务代表 ---->查找服务(ServletLocator) ---->业务服务
    请参照:  服务定位器模式,会话门面模式,代理模式。
 
示例
 
    在petStore中ShoppingClientControllerWebImpl 其实就是一个业务代表的例子。
    public class ShoppingClientControllerWebImpl implements java.io.Serializable {

        private ShoppingClientController sccEjb;
        private HttpSession session;

        public ShoppingClientControllerWebImpl() {}

        public ShoppingClientControllerWebImpl(HttpSession session) {
            this.session = session;
            ModelManager mm =
                (ModelManager)session.getAttribute(WebKeys.ModelManagerKey);
            sccEjb = mm.getSCCEJB();
        }

        public synchronized ShoppingCart getShoppingCartEJB() {
            try {
               return sccEjb.getShoppingCart();
            } catch (EStoreAppException ce) {
               throw new GeneralFailureException(ce.getMessage());
            } catch (RemoteException re) {
               throw new GeneralFailureException(re.getMessage());
            }
        }

        public synchronized Customer getCustomerEJB() {
            try {
                return sccEjb.getCustomer();
            } catch (EStoreAppException fe) {
                throw new GeneralFailureException(fe.getMessage());
            } catch (RemoteException re) {
                throw new GeneralFailureException(re.getMessage());
            }
        }
 
        //.............

        public synchronized void remove() {
            try {
                sccEjb.remove();
            } catch(RemoveException re){
                Debug.print(re);
            } catch(RemoteException re){
                Debug.print(re);
            }
        }
    }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PetStore 中EJB 的设计模式
tigase增加离线消息,message
JAVA NoClassDefFoundError
韩顺平的SqlHelper类
《Head First设计模式》阅读笔记.第十一章
Android中Messenger的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服