About me

我的照片
目前就职于杭州某电子商务公司,工作兴趣包括高并发分布式架构,JVM性能优化等方面。

2012年2月29日星期三

常用代码:EventDispatcher


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);
    }
}

没有评论:

发表评论