Java實現一個簡單的事件監聽器

關於事件監聽我們需要知道的一些基礎知識。

a)事件三要素:

source —— 事件源

when —— 事件發生時間

message —— 事件主題訊息,即希望透過事件傳遞出去的資訊

b)事件流轉過程:

(1)事件源註冊監聽器 -> (2)事件發生 -> (3)通知監聽器 -> (4)監聽器處理

那麼基於以上背景知識,我們開始實現一個簡單的監聽器,並測試一下事件監聽的完整流程。

根據事件三要素設計出一個簡單合理的事件載體:Event

public class Event implements Serializable { private Object source; private Date when; private String message; public Object getSource() { return source; } public void setSource(Object source) { this。source = source; } public Date getWhen() { return when; } public void setWhen(Date when) { this。when = when; } public String getMessage() { return message; } public void setMessage(String message) { this。message = message; }}

監聽器介面:EventListener

public interface EventListener { /** * 事件觸發 * @param event */ void handleEvent(Event event);}

監聽器實現:MyListener

public class MyListener implements EventListener { private Log log = LogFactory。getLog(getClass()); private SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”); @Override public void handleEvent(Event event) { log。info(“source: ” + event。getSource() + “, message: ” + event。getMessage() + “, when: ” + sdf。format(event。getWhen())); }}

為了規範化,我們在這裡制定一個事件源介面:EventSource

public interface EventSource { /** * 增加監聽器 * @param listener */ void addListener(EventListener listener); /** * 通知監聽器 */ void notifyListeners();}

編寫測試的事件源:MySource

public class MySource implements EventSource { private List listeners = new ArrayList(); private int value; @Override public void addListener(EventListener listener) { listeners。add(listener); } @Override public void notifyListeners() { for (EventListener listener : listeners) { Event event = new Event(); event。setSource(this); event。setWhen(new Date()); event。setMessage(“setValue ” + value); listener。handleEvent(event); } } public int getValue() { return value; } public void setValue(int value) { this。value = value; notifyListener(); } public static void main(String[] args) { MySource source = new MySource(); source。addListener(new MyListener()); source。setValue(100); }}

測試輸出:

[INFO]-[MyListener-handleEvent(16)]: source: [email protected], message: setValue 100, when: 2018-05-01 01:18:35

*PS:是不是覺得這個跟觀察者設計模式很像,沒錯。就效果而言,事件監聽器模式和觀察者模式並沒有什麼區別,不過在事件模型的設定上有些許差別。在觀察者模式中並沒有Event這個角色,或者說它被合併到Observable角色中了,即整合了事件源與事件。