Event與Listener機制

事件觸發式的程式設計架構,主要由一個傾聽者(Listener)與一個觸發事件(Event)與一個事件管理程式所組成,此種架構是一個相當普遍的程式設計技巧,由其在Java Awt、Swing這類GUI圖形設計更是大量的被採用做為使用者與GUI介面之間的互動的介面(例如、傾聽滑鼠的狀態、鍵盤狀態或是按鈕是否被按下),事件觸發式程式設計的基本理念與現實生活中的保全系統相當相似,舉例來說,一棟具有保全設備的大樓通常會安裝相當多的感應器,而每個感應器都有各自所負責的區域與特性,例如走道上的紅外線感應器負責檢查是否有人經過、窗戶上的電磁感應器負責檢查窗戶是否被打開,而每個感應器最後都會連接到中央保全系統,保全系統中會定義當感應器被觸發後要通知的對像(例如連線到保全中心、警察局、或告知屋主),最後一但這些感應器被觸發,中央保全系統便會發出訊息給需要通知的對像。

在這個例子中感應器等同於程式中的事件(Evnet),中央保全系統等同於事件管理程式,最後當感應器被發後所要通知的對就等且於程式中的傾聽者(Listener)。由保全系統的例子來說,事件管理程式必須負責管理所有的觸發事件,並提供傾聽者(Listener)註冊所感興趣的觸發事件,一但該事件被觸發了管理程式首先會檢查註冊表中那個監聽者對此事件感興趣,並立即通報該監聽者事件己被觸發,在通知的同時管理程式也可以額外提供一些資訊給監聽者(如被觸發的時間點),監聽者在收到通知後便進行預先針對此事件所撰寫好的處理程式。

以下範例將以上述的保全系統為例,實作一套事件觸發機制。

【中央保全系統:SecurityCenter.java】

package com.lattebox.event;

【感應器:Sensor.java】

package com.lattebox.event;

【傾聽者一: SecurityListener.java】

package com.lattebox.event;

【範例主程式: MainSample.java】

package com.lattebox.event;

【執行結果】

執行MainSample主程式後將輸出以下結果:

向SecurityCenter註冊傾聽介面*

圖 422 MainSample程式輸出結果

由上述的結果可以得知,傾聽者(SecurityListener介面)向保全中心(SecurityCenter類別)註冊之後,一但有感測器被觸發,主程式便可立即的收到保全中心的回報,並取得被觸發的感測器資訊。而當主程式向保全中心移除註冊後感測器仍然還是在繼續的運作者,只是就算有感測器被觸發,主程式也收不到任何來自於保全中心的回報。透過事件的方式實作可以使程式碼更具有結構化,可以預先定義好每一個事件被觸發時的應對程式,並實做所感興趣的事件傾聽介面,透過註冊與反註冊的程序可以決定是否要接收事件觸發回報。

Java + Android系統應用入門

作者: Jarey
Email [email protected]
課程: 第四堂
內容: Java Design Patterns