Observer模式在J2EE中的實現 [http://35java.com/zhibo/forum.php?mod=viewthread&tid=108&extra=page%3D3]
引言:設計模式是經驗的文檔化。它是對被用來在特定場景下解決一般設計問題的類和相互通信的對象的描述。更通俗的來說,它是一個問題/解決方案對。一旦我們掌握了設計模式,就等于擁有了一支強有力的專家隊伍。它甚至能夠使面向對象的新手利用前人的經驗找出職責明確的類和對象,從而獲得優雅的解決方案。由于設計模式也是重構的目標,如果在設計的初期適當地引入設計模式,可以減少重構的工作量。
但是,我們也不能陷入模式的陷阱,為了使用模式而去套模式,那樣會陷入形式主義。我們在使用模式的時候,一定要注意模式的意圖(intent),而不要過多的去關注模式的實現細節,因為這些實現細節在特定情況下,可能會發生一些改變。不要頑固地認為設計模式一書中的類圖或實現代碼就代表了模式本身。
下面,我們來討論一下為什么要在分布式、多層系統中使用Observer模式。
多層體系結構(multi-tier architecture):
三層體系結構是多層體系結構中最簡單的一種,它一般包括:
- 表示層(presentation)-窗口、報表-
- 業務邏輯層(business logic)-管理業務過程的任務和規則。它又可以細分為領域對象層(代表領域概念)和服務層(提供數據庫交互、安全性、打印報表)。
- 存儲層(storage)-持久化存儲機制。如數據庫服務器等。
圖一:三層體系結構

而Java 2平臺企業版(J2EE)是一種利用Java 2平臺來簡化諸多與多級企業解決方案的開發、部署和管理相關的復雜問題的體系結構。它是開放的、基于標準的平臺,用以開發、部署和管理N層結構、面向Web的,以服務器為中心的企業級應用。
為了支持領域對象的復用,并且使領域對象的接口變更所帶來的影響最小化。我們將領域層(模型)和表示層(視圖)相分離。
采用模型-視圖模式的意義在于:
- 支持聚合度更高的模型定義,使模型的定義可以集中在領域過程的定義,而不是圖形界面上。
- 允許將模型和用戶界面并行開發。
- 使用戶界面的需求變化對領域層所造成的影響最小化。
- 允許建立與一個現有的領域層對象相連接的新視圖,同時不影響領域層。
- 允許一個模型同時有多個視圖,例如使用SVG和表格。
- 允許模型層獨立于用戶界面層執行。
其實,在應用中更多的是采用MVC框架來架構整個企業應用的。在MVC框架中,Model和View之間存在著依賴關系,是Observer模式的典型應用。當然MVC框架還包括其它模式如Composite模式和Strategy模式。在J2EE平臺中,我們可以把Web Tier(包括Jsp和servelet和JavaBean)看作是表示層,EJB Tier看作是領域層。而controller可能跨距Web Tier和 EJB Tier。
在Java類庫中采用Java.util.Observable類和Java.util.Observer接口來實現Observer模式,它們在單個的Java VM.中運行的很好,但如果想在EJB中使用它們就會有一些問題。這正如我們引言中提到的,模式的具體實現在特定情況下,可能會發生一些改變。
值傳遞還是遠程引用傳遞?
值傳遞:
在Java RMI中要求所有的參數和返回類型是JAVA的基本類型或實現Java.io.Serilizable的對象。串行化對象通過值傳遞(又名拷貝傳遞),而不是引用傳遞,這意味著在某一層中串行化對象的更并不自動影響到其它的對象。
遠程引用傳遞:
對于EJB對象而言,它由兩個接口(home接口和remote接口)和一個類組成。容器會根據ejb規范來生成實現上面兩個接口的類(我們分別稱為xxxEJBHome對象和xxxEjbObject對象)。在較多的容器的實現方案中,xxxEJBHome對象使用了factory模式來創建xxxEjbObject對象;xxxEjbObject對象則采用proxy模式,作為xxxBean的代理類。在生成以上兩個對象的同時,容器會從部署文件中讀取關于安全、事務、持久性等服務并在xxxEjbObject對象和xxxEJBHome對象中添加以上服務的代碼。而且xxxEJBHome對象和xxxEjbObject對象都是分布式對象,我們在此只討論xxxEjbObject對象。所謂分布式對象,從本質上來講,分為3個部分:object server、skeleton、stub。其中object server和skeleton位于服務器端,而stub位于客戶端。Object server負責實現業務邏輯,skeleton負責marshal和unmarshal方法簽名。
圖二:分布式對象

顯然,EJB的客戶(調用EJB的對象)可以是任何對象,包括EJB和一般的Java類甚至是用任何語言寫的corba客戶端。
從EJB的客戶視角來看的話,我們只能看到一個home接口、一個remote接口(對于實體bean的話,還可以看見一個主鍵類,而bean類對客戶是不可見的)。但我們從上面的論述,我們可以知道,對于remote接口中地方法調用,實際上是多態地調用XXX_Stub類。即XXX_Stub對象對客戶具有可見性(但這種可見性是透明的,即客戶不知道這種可見性的存在)。由于,XXX_Stub對象和Object Server實現了相同的接口,并且Object server真正實現了業務邏輯。所以,當在客戶端調用XXX_Stub對象的方法時候,XXX_Stub對象通過socket通信機制將方法簽名傳給XXX_Skeleton對象,XXX_Skeleton對象在去委托Object Server完成業務處理邏輯。因此,Object Server本身發生了改變。我們稱XXX_Stub對象是Object Server對象的遠程引用,并認為當分布式對象作為參數傳遞的時候,是通過引用傳遞的(會產生副作用
posted on 2011-02-13 19:24 九寶 閱讀(425) 評論(0) 編輯 收藏 所屬分類: Java 、Java Study(JavaThinking4)