Event/Listener模式在Java中很常見,並且很有用,但要自己來實現這個模式是一件很費時間並且單調乏味的工作。每次你都不得不和List或Vector打交道,每次你都不得不處理Add方法、Remove方法,然後你還得遍歷整個列表來通知所有的監聽者,這才算完。
如果能象下面這樣簡單就好了:
Notifier notifier = new NotifIEr("actionPerformed");
...
notifIEr.addListener( someObject );
...
notifIEr.notify( new ActionEvent(this) );
只要幾行代碼就能夠完成一切。
下面的NotifIEr類就達到了這個目的:
package com.generationJava.lang;
import Java.util.*;
import Java.lang.reflect.*;
public class NotifIEr {
private ArrayList listeners = new ArrayList();
private String listenerMethod;
public NotifIEr(String name) {
this.listenerMethod = name;
}
public void addListener(Object not) {
this.listeners.add(not);
}
public void removeListener(Object not) {
this.listeners.remove(not);
}
public void notify(EventObject event) {
Iterator itr = listeners.iterator();
while(itr.hasNext()) {
try {
Object listener = itr.next();
Class clss = listener.getClass();
Method method = clss.getMethod(
this.listenerMethod,
new Class[] { event.getClass() }
);
method.invoke( listener, new Object[] { event } );
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
這個類並沒有經過性能上的優化,而且它是不同步的,但在編寫一組Event/Listener API的時候,可以很快掌握它並且節省時間。利用NotifIEr類,你就能執行這樣一個常見的任務而不必每次都為之編寫代碼。