第二章 兩種設計模式在EJB開發中的應用(1 / 3)

第二章 兩種設計模式在EJB開發中的應用

一、概述

與傳統的二層體係結構相比,J2EE有兩個特點:

1、定義了一套標準化組件,通過為這些組件提供完整的服務。

2、使用多層分布式的應用程序模型。應用程序的邏輯根據其實現的不同功能被封裝到不同的組件中。如圖1所示。

這種多層結構使企業級應用具有很強的伸縮性,允許各層專注於某種特定的角色:

1、ClientTier用於顯示。

2、WebTier用於生成動態顯示。

3、BusinessTier用於實現業務邏輯。

4、EISTier用於數據庫服務。

其中,用於實現業務邏輯的EJB組件架構是J2EE的基礎和最重要的部分。

正是認識到J2EE平台作為一種可擴展的、全功能的平台,可以將關鍵的企業應用擴展到任何Web瀏覽器上並可適合多種不同的Internet數據流、可連接到幾乎任何一種傳統數據庫和解決方案,J2EE已經成為開發電子商務應用的事實標準。

為了使開發者開發出規範的、可重用的應用程序,J2EE為我們提供了大量的模式。模式盡管有時不易理解,但使用卻非常簡單,它提供了強大的可重用機製,避免了開發者和設計者的重複投資。

可是,麵對如此多的模式,初學者往往不知如何下手,為此,作者結合以往的開發經驗,詳細介紹如何使用模式完成EJB的設計。

二、設計與實現

1.值對象模式

J2EE應用程序把服務器端業務組件實現為會話Bean和實體Bean。對於實體Bean的創建,開發人員通常采用CMP(容器管理持久性)模式,其好處在於容器提供公共的服務,例如目錄服務、事務管理、安全性、持久性、資源緩衝池以及容錯性等,使開發人員不必維護將會集成到業務邏輯中的係統級代碼,隻需專注於商業邏輯。

一般來說,有了實體bean,就可以通過調用業務組件的一些方法向客戶端返回數據。初學者往往會認為既然客戶端可以與服務器通信,那麼任務就算完成了。可是,問題恰恰出在這裏。業務組件的get方法隻能返回一個屬性值,這就導致需要獲得所有屬性值的客戶端需要多次調用業務對象的get方法,如圖2-1所示。每次調用都是一次網絡調用,都會造成係統性能的退化,當調用次數增多時,係統性能就會嚴重下降。

這就要求有一種方法使客戶端可以一次調用得到所需的大量數據,這種方法就是ValueObject(值對象)模式。值對象是任意的可串行化的Java對象,也被稱為值的對象,它在一次網絡傳輸中包含和封裝了大量的數據並被保存在內存中。這樣,當客戶端需要再次使用數據的時候,不用再次到數據庫中查詢,而是直接在內存中讀取值對象,節省了大量的時間和係統開銷,如圖2-2。

值對象模式有兩種策略――可更新的值對象策略和多值對象策略。

可更新的值對象策略中,業務對象負責創建值對象,並且在客戶端請求時把該值對象返回給客戶端;同時,業務對象也可以從客戶端接收數據,形成值對象,並使用該對象來完成更新。

例如,在銀行係統的例子中,Account中提供一個以AccountValue為參數的setAccountValueObject方法,這樣客戶端可以通過這個方法來設置值對象的值,而不采用實體bean--Account中設置每個屬性的方法(setBalance()),因為後一種方法會導致大量的網絡負載。由於值對象的易變性,所以值對象類必須給每個可以被客戶端更新的屬性提供設置方法。例如,AccountValue中的setBalance()方法。這樣,一旦某客戶端擁有來自業務對象的值對象,客戶端就可以在本地調用必要的設置方法來更改屬性值,然後調用業務對象的setAccountValueObject()方法更新業務對象。

多值對象策略