Session Facade設計模式
引用地址:http://www.xici.net/b391997/d26431792.htm [復制超文本復制] 返回《JAVA 基礎》 關閉窗口

 
 

J2EE是Sun公司提出的開發和運行企業級Web應用的標準,可以用于開發大型的、多層次的以及分布式的企業級Web應用系統。J2EE技術為組件開發提供了廣泛的支持,同時也提供了豐富的開發工具和服務,便于開發模塊化的,可重用的和平臺獨立的業務邏輯 [4]。設計模式的優勢在J2EE應用的設計中得到了充分的體現。

EJB的設計是J2EE應用設計中的核心模塊。它強調的是可復用性、可維護性、可移植性等。當開發者設計EJB時,最困難的工作就是要選擇一個正確的體系結構,或者一個正確的邏輯層的劃分 [5]。目前,EJB的設計模式有幾十種,如何選擇適合自己項目的模式是EJB設計的關鍵問題,也是最難解決的問題。

1引入Session Facade模式

EJB客戶端可以直接通過網絡訪問參與工作流的業務對象,如圖1所示:

 

圖1:無Session Facade時的情況

這樣處理時存在著幾個問題:

l     當依靠RMI-IIOP技術進行跨越網絡的調用時,系統性能會受到極大影響。如果一個客戶端需要兩個業務對象的信息,比如用戶在網上購物時,同時需要得到CustomerEJB中的用戶名及購物密碼、AddressEJB中的用戶E-MAIL和電話等,則將需要兩個遠程方法調用,并且這兩個調用都是細粒度的。如果一個EJB客戶端需要調用三個業務對象的方法,則將需要三個遠程方法調用。當存在著大量的EJB客戶端,而每個客戶端又需要調用多個業務對象時,這種細粒度的網絡調用就會成倍的增加,系統性能就會因為網絡負載而降低。

l     更重要的是,如果允許 EJB 客戶端直接訪問業務對象,那么就要求客戶端了解業務對象的內部方法,這樣就把業務模型的細節不適當地暴露給了客戶端,從而增加了客戶端與業務對象之間的耦合度。當業務對象的方法做了改動時,調用它的客戶端的程序也要進行相應的修改。這樣做就違背了EJB的設計中要求具有良好的可移植性的原則。

為了解決這個問題,有幾個常見的解決方案:

1.在業務對象中加入額外的邏輯,在一個單獨的客戶調用中完成許多操作。這個解決方案引入了維護問題。如果每次需要性能增強時都在業務對象上增加應用邏輯,則業務對象將很快變得臃腫和難于理解,難以維護和復用。

2.為客戶端劃分一個聚合,該聚合通過JTA構建一個大的事務。每個業務對象的方法調用都工作在一個相同的事務之下。這個改進的解決方案也有很多缺點,如網絡開銷高,并發性差,耦合度高,可復用性差,可維護性差等。

3.在EJB設計中,避免直接訪問業務對象的最佳解決方案就是運用Session Facade模式。

2 Session Facade模式介紹

Facade模式描述為:“為子系統中的一套接口提供了一個統一的接口。Facade 定義了一個更高層次的接口,使子系統更容易使用。”[6] 在EJB設計中,Session Facade是應用最廣泛的設計模式。它應用Session Bean來實現Facade模式的思想,把構成子系統的一套業務對象“包裝”在Session Bean中。這樣,Session Facade作為客戶端訪問業務對象的攔截器,屏蔽了業務對象。EJB客戶端訪問Session Bean來代替訪問業務對象,當一個EJB客戶端需要調用多個業務對象的方法時,它只需要進行一次粗粒度的遠程方法調用,將請求送給Session Facade, 再由Session Facade通過本地方法調用,調用相應的業務對象,執行其方法。這樣就減輕了網絡負載,提高了系統性能。并且當業務對象的方法改動時,只需要修改Session Bean,而客戶端可以保持不變。這就減少了客戶端和業務對象之間的耦合度,同時客戶端也不必管理事務的細節。如圖2所示:

 

圖2:有Session Facade時的情況

3 Session Facade模式的優點

1)    嚴格分離了業務邏輯和表示層,降低系統的耦合度,提高可管理性。Session Facade作為客戶端和業務對象之間的控制器,實現客戶端和業務對象之間的交互。Session Facade模式將業務邏輯完全封裝在Session Bean中。客戶端作為表示層,無須關心業務邏輯層的事情,這就嚴格的將業務邏輯從表示邏輯分離。從而可以減少緊密耦合,以及客戶端對業務組件的依賴性。

2)    提供簡單的統一接口。客戶端和業務對象之間的交互是非常復雜的。Session Facade抽象了該復雜性,并向客戶端提供了一個容易理解和使用簡單的統一接口。Session Facade可以向不同類型的客戶端提供統一的粗粒度訪問接口。

3)    降低網絡開銷,提高系統性能。由于Session Facade提供了粗粒度的訪問,因此,客戶端可以只調用一次Session Facade的遠程方法,即只需要一次網絡調用;在服務器端,Session Facade和業務對象通過本地接口來調用,從而不需要任何網絡開銷。 即使Session Facade和業務對象通過遠程接口來調用, 大多數應用服務器也將優化它們之間的通信。

4)    安全集成管理。由于Session Facade是客戶端訪問服務器的接口,這樣應用程序的安全策略就可以在Session Facade層進行管理。同時由于Session Facade只需要管理相對較少的粗粒度方法,所以安全策略變得更加容易使用和實現。

5)    事務集成控制。Session Facade提供了管理和定義事務的集中點。在Session Facade上實施事務控制比在所參與的每一個業務對象上實施事務控制關注的對象要少,粒度更大,更容易管理和控制。