import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
public class EventDispatcher {
public EventDispatcher() {
listenerMap = new HashMap<Class<? extends ClientEvent>, CopyOnWriteArrayList<ClientEventListener>>();
}
/**
* 添加事件监听器
*
* @param listener
*/
public void addEventListener(ClientEventListener listener) {
List<ClientEventListener> listenerList = getListenerList(listener.interest());
if (!listenerList.contains(listener)) {
listenerList.add(listener);
}
}
/**
* 把事件监听器添加在所属列表的指定位置。
*/
public void addEventListener(ClientEventListener listener, int idx) {
List<ClientEventListener> listeners = getListenerList(listener.interest());
if (!listeners.contains(listener)) {
listeners.add(idx, listener);
}
}
List<ClientEventListener> getListenerList(
Class<? extends ClientEvent> eventType) {
CopyOnWriteArrayList<ClientEventListener> listeners = listenerMap.get(eventType);
if (null == listeners) {
listeners = new CopyOnWriteArrayList<ClientEventListener>();
listenerMap.put(eventType, listeners);
}
return listeners;
}
/**
* 发布client事件。
*/
public void fireEvent(ClientEvent event) {
CopyOnWriteArrayList<ClientEventListener> listeners = listenerMap.get(event.getClass());
if (null != listeners) {
for (ClientEventListener listener : listeners) {
try {
listener.onClientEvent(event);
} catch (Exception e) {
// TODO
}
}
}
}
// ========================
private final Map<Class<? extends ClientEvent>, CopyOnWriteArrayList<ClientEventListener>> listenerMap;
// ========================
/**
* Client事件。
*/
static public abstract class ClientEvent {
}
/**
* Client事件监听器。
*/
static public abstract class ClientEventListener {
/**
* 感兴趣的事件类型
*/
abstract public Class<? extends ClientEvent> interest();
/**
* 处理事件
* @param event
*/
abstract public void onClientEvent(ClientEvent event);
}
}

