物件間的聯動——觀察者模式(五)

Liuwei-Sunny發表於2012-07-06

22.5 觀察者模式與Java事件處理

       JDK 1.0及更早版本的事件模型基於職責鏈模式,但是這種模型不適用於複雜的系統,因此在JDK 1.1及以後的各個版本中,事件處理模型採用基於觀察者模式的委派事件模型(DelegationEvent Model, DEM),即一個Java元件所引發的事件並不由引發事件的物件自己來負責處理,而是委派給獨立的事件處理物件負責

      在DEM模型中,目標角色(如介面元件)負責釋出事件,而觀察者角色(事件處理者)可以向目標訂閱它所感興趣的事件。當一個具體目標產生一個事件時,它將通知所有訂閱者。事件的釋出者稱為事件源(Event Source),而訂閱者稱為事件監聽器(Event Listener),在這個過程中還可以通過事件物件(Event Object)來傳遞與事件相關的資訊,可以在事件監聽者的實現類中實現事件處理,因此事件監聽物件又可以稱為事件處理物件。事件源物件、事件監聽物件(事件處理物件)和事件物件構成了Java事件處理模型的三要素。事件源物件充當觀察目標,而事件監聽物件充當觀察者。以按鈕點選事件為例,其事件處理流程如下:

       (1) 如果使用者在GUI中單擊一個按鈕,將觸發一個事件(如ActionEvent型別的動作事件),JVM將產生一個相應的ActionEvent型別的事件物件,在該事件物件中包含了有關事件和事件源的資訊,此時按鈕是事件源物件;

       (2) ActionEvent事件物件傳遞給事件監聽物件(事件處理物件),JDK提供了專門用於處理ActionEvent事件的介面ActionListener,開發人員需提供一個ActionListener的實現類(如MyActionHandler),實現在ActionListener介面中宣告的抽象事件處理方法actionPerformed(),對所發生事件做出相應的處理;

       (3) 開發人員將ActionListener介面的實現類(如MyActionHandler)物件註冊到按鈕中,可以通過按鈕類的addActionListener()方法來實現註冊;

       (4) JVM在觸發事件時將呼叫按鈕的fireXXX()方法,在該方法內部將呼叫註冊到按鈕中的事件處理物件的actionPerformed()方法,實現對事件的處理。

       使用類似的方法,我們可自定義GUI元件,如包含兩個文字框和兩個按鈕的登入元件LoginBean,可以採用如圖22-6所示設計方案:

22-6 自定義登入元件結構圖【省略按鈕、文字框等介面元件】

       圖22-6中相關類說明如下:

       (1) LoginEvent是事件類,它用於封裝與事件有關的資訊,它不是觀察者模式的一部分,但是它可以在目標物件和觀察者物件之間傳遞資料,在AWT事件模型中,所有的自定義事件類都是java.util.EventObject的子類。

       (2) LoginEventListener充當抽象觀察者,它宣告瞭事件響應方法validateLogin(),用於處理事件,該方法也稱為事件處理方法,validateLogin()方法將一個LoginEvent型別的事件物件作為引數,用於傳輸與事件相關的資料,在其子類中實現該方法,實現具體的事件處理。

       (3) LoginBean充當具體目標類,在這裡我們沒有定義抽象目標類,對觀察者模式進行了一定的簡化。在LoginBean中定義了抽象觀察者LoginEventListener型別的物件lel和事件物件LoginEvent,提供了註冊方法addLoginEventListener()用於新增觀察者,Java事件處理中,通常使用的是一對一的觀察者模式,而不是一對多的觀察者模式,也就是說,一個觀察目標中只定義一個觀察者物件,而不是提供一個觀察者物件的集合。在LoginBean中還定義了通知方法fireLoginEvent(),該方法在Java事件處理模型中稱為“點火方法”,在該方法內部例項化了一個事件物件LoginEvent,將使用者輸入的資訊傳給觀察者物件,並且呼叫了觀察者物件的響應方法validateLogin()

      (4) LoginValidatorALoginValidatorB充當具體觀察者類,它們實現了在LoginEventListener介面中宣告的抽象方法validateLogin(),用於具體實現事件處理,該方法包含一個LoginEvent型別的引數,在LoginValidatorALoginValidatorB類中可以針對相同的事件提供不同的實現。

【作者:劉偉   http://blog.csdn.net/lovelion

相關文章