| 
             目的 
                
            为一组enterprise 
              beans提供一个统一的,面向工作流的接口。 
               
            别名 
                
            Session 
              Entity Facade(早期的模式版本中),Distributed 
              Facade 
               
            动机 
                
            需要不同类型应用的用户需要不同的功能来支持他们的工作流。以Java 
              Pet Store为例,消费者需要先登陆,查看物品目录,填写自己的订单, 
              同时系统管理员有能力确认或拒绝订单,并将确认后的详细订单提交。 
               
            考虑到直接用enterprise 
              bean来开发会带来的问题: 
            1.客户端的对象需要很清楚的知道和bean之间的交互动作。可是,没有什么可以阻止客户端不正确的使用bean. 
               
            2.如果bean的API被修改了,那么客户端的对象也不得不相应的修改。这种改动会很难控制。 
               
            3.即便是一个工作流中的几个enterprise 
              bean在同一台server上,当一个客户端的对象进行远程调用时还是会调用每一个。这种方式无形之中就增加了网络的负担。 
               
            解决这个问题的方法就是要用到session 
              facade(会话外观),他为一组enterprise 
              bean提供了一个统一的接口.它执行起来很像是一个session 
              bean. 
                                    
            在Java 
              Pet Store这个例子中,shoppingClientControllerEJB(程序一)就是一个会话外观,由它来提供客户端所需要的服务。它并不像CustomerEJB(程序二) 
              和ShoppingCartEJB(程序三)那样直接访问enterprise 
              beans,而是客户端直接通过一个在shoppingClientControllerEJB中的简单的接口来访问。(其中定义了 
              一个方法来处理EStoreEvent对象)。 
               
            shoppingClientControllerEJB是一个session 
              bean,它和其他的enterprise 
              bean在同一台服务器上。 
              因此,只需要一次远程的调用就可以进行购物的工作流了,这个调用的请求被发送到shoppingClientControllerEJB。 
              当外观收到这个请求,它调整它”相邻的”在同一台服务器上的enterprise 
              beans,因此减少了网络通信。 
               
            适用性 
                
            作为外观模式的一个实例,这种模式共享了它的适用性。当我们在考虑J2EE的应用开发时,以下情况建议使用会话外观: 
            .当你想为一个复杂的子系统中的enterprise 
              bean提供一个简单的接口时; 
            .当你想减少客户端与enterprise 
              bean之间直接的联系和依赖性的时候。   
               
            结构 
                
                 
               
            参与者 
                
            会话外观(ShoppingClientControllerEJB) 
            .支持特殊工作流或者是多套的工作流. 
            .把工作交付到enterprise. 
                
            EnterpriseBeans(CustomerEJB, 
              ShoppingCartEJB, 
              etc.) 
                
            .执行一个业务逻辑以满足最基本的需要。 
                
            .和会话外观无关。 
                
               
            协作 
                
            会话外观协调组成它的enterprise 
              bean,来完成一个工作流所需要的功能。   
               
            结论 
                
            这种模式有以下的优点: 
                
            .使用enterprise 
              bean更为的灵活。商业对象的误用性减少,因为它们内部的这种联系是通过会话外观来控制的。 
                
            .更易支持客户端的多样性。无论是jsp前端还是jfc/swing的前端,或者任何一个web服务都是通过相同的外观来访问数据源。 
                
            .一个集中管理登录,事务处理和安全的地方。由于客户端只能通过会话外观来执行操作,所以用它来管理上述的这些功能是很常见的。 
                
            .减少了数据阻塞。和同时远程调用多个enterprise 
              bean不一样,客户端只能远程调用会话外观, 
              而会话外观能起到更好的协调性。   
            .企业的数据原型具有更强的适用性。如果原型的这种内部的关联被外观或者是多套的外观控制起来,当企业的数据原型发生变化时将会更容易访问到。 
                
            一个会话外观可以用EJB,JDBC 
              API,CORBA,来提过客户端所需的功能。由于服务器端实现的细节相对客户端是透明的,所以当应用服务发生改变是不需要调换客户端。 
               
            执行 
                
            一个会话外观在执行的时候类似于一个会话 
              bean有两个原因:首先,在”结论”中提到的,一个外观以enterprise 
              bean的方式来执行的时候可以降低网络的负载。其次, 
              一个外观很明显的不是一个实体bean,虽然通过它来访问和更新数据,它是它并不直接对数据库进行操作。 
            以下介绍在实现一个会话外观的时候何时使用有状态的会话bean和无状态的会话bean: 
            .用有状态的会话bean来表现一种客户端精确定义的,生命周期比较短的工作流。 
            .用无状态的会话bean来提供一种普通的服务。 
            如果想了解更多有关如何应用会话bean的问题,请参阅J2EE 
              蓝图中的"Session 
              Beans" 
               
            在实现这种模式的时候请考虑以下几个问题: 
            .使用客户端的外观来取代服务器端的外观。开发者将很容易的感觉到实现一个客户端的外观比实现一个服务器端的外观要容易得多。 
              然而,一个客户端的外观不能减少网络的负载。   
            .同时使用客户端的外观和服务器端的外观。有时通过客户端的外观与服务器端的外观的对话会得到更好的效果。它使客户端的API(有时候,这是很复杂的) 
              和服务器端的API分离,允许在开发的过程中独立的变化。   
            .使用命令模式(command 
              pattern).当企业的数据类型改进的时候,一个会话外观的接口会变得很复杂。通过命令模式可以管理这种复杂性。 
                
               
            例程 
                
            在Java 
              Pet Store这个例子中,ShoppingClientControllerEJB为客户端提供服务。它的接口非常的简单; 
                
            public class ShoppingClientControllerEJB implements SessionBean {  
                // ... 
                public Collection handleEvent(EStoreEvent ese)   
                    throws EStoreEventException {  
                    return sm.handleEvent(ese);   
                }
  
                // ...  
            }  
            相关的模式  
            外观:由它的名字可以知道,一个会话外观是一个外观的实例。  
            值对象:值对象模式和这种模式的目的都是为了减少远程方法的调用。值对象通过提高本地方法调用来达到目标,
而会话外观通过提高服务器端方法调用来达到目标。  
             注:由于这是本人水平有限,如果您觉得有什么错误或意见,请告诉我,我期待着和您的讨论,同时,感谢您阅读了这篇文章。   |