物件間的聯動——觀察者模式(五)
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) LoginValidatorA和LoginValidatorB充當具體觀察者類,它們實現了在LoginEventListener介面中宣告的抽象方法validateLogin(),用於具體實現事件處理,該方法包含一個LoginEvent型別的引數,在LoginValidatorA和LoginValidatorB類中可以針對相同的事件提供不同的實現。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 物件間的聯動——觀察者模式(六)物件模式
- 物件間的聯動——觀察者模式(四)物件模式
- 物件間的聯動——觀察者模式(三)物件模式
- 物件間的聯動——觀察者模式(二)物件模式
- Go 實現常用設計模式(五)觀察者模式Go設計模式
- 流動的觀察者模式 | Flutter 設計模式Flutter設計模式
- 設計模式-- 觀察者模式Observer(物件行為型)設計模式Server物件
- 設計模式(六)觀察者模式詳解(包含觀察者模式JDK的漏洞以及事件驅動模型)設計模式JDK事件模型
- 觀察者模式模式
- js物件導向之 觀察者模式介紹JS物件模式
- PHP觀察者模式PHP模式
- Unity——觀察者模式Unity模式
- 觀察者模式(2)模式
- Java 觀察者模式Java模式
- JS 觀察者模式JS模式
- 進擊的觀察者模式模式
- ListView中的觀察者模式View模式
- Observable - 觀察者模式的理解模式
- 觀察者模式的總結模式
- 設計模式中的觀察者模式設計模式
- 設計模式----觀察者模式設計模式
- 設計模式 —— 觀察者模式設計模式
- 設計模式(觀察者模式)設計模式
- 設計模式——觀察者模式設計模式
- 設計模式-觀察者模式設計模式
- 設計模式_觀察者模式設計模式
- 【設計模式】觀察者模式設計模式
- 觀察者模式-將訊息通知給觀察者模式
- 協調多個物件之間的互動——中介者模式(三)物件模式
- Java進階篇設計模式之十三 ---- 觀察者模式和空物件模式Java設計模式物件
- 我的Java設計模式-觀察者模式Java設計模式
- PHP-觀察者模式PHP模式
- PHP 之觀察者模式PHP模式
- 大話--觀察者模式模式
- redux與觀察者模式Redux模式
- 觀察者模式介紹模式
- 重構 - 觀察者模式模式
- 觀察者模式(ObserverPattern)模式Server