java事件机制(订阅/消费模型)

java的事件机制一般包括三个部分:EventObject,EventListener和Source。


1.EventObject

java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类

public class MsgEvent extends EventObject {
    private static final long serialVersionUID = 1L;
    //也可以用source来传递值 这里用status来传递值
    private int status;

    public MsgEvent(Object source) {
        super(source);
    }

    public MsgEvent(Object source, int status) {
        super(source);
        this.status = status;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

2.EventListener

java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。

public interface MsgListener extends EventListener {
    void handleMsg(MsgEvent event) throws Exception;
}

3.Source

事件源不需要实现或继承任何接口或类,它是事件最初发生的地方。因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。

触发动作

public class MsgManager {
    static List subs = new ArrayList();

    public static void addListener(MsgListener listener) {
        subs.add(listener);
    }

    public static void sendMsg(MsgEvent event) throws Exception {
        notifyListeners(event);
    }

    public static void notifyListeners(MsgEvent event) throws Exception {
        for (MsgListener listener : subs) {
            listener.handleMsg(event);
        }
    }

    public static void main(String[] args) {
        try {
            //监听器A
            MsgManager.addListener(new MsgListener() {
                public void handleMsg(MsgEvent event) throws Exception {
                    System.out.println("MsgListenerA," + event.getStatus());
                }
            });

            //监听器B
            MsgManager.addListener(new MsgListener() {
                public void handleMsg(MsgEvent event) throws Exception {
                    System.out.println("MsgListenerB," + event.getStatus());
                }
            });

            MsgEvent msg = new MsgEvent("test", 11);

            sendMsg(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

执行main 效果

MsgListenerA,11
MsgListenerB,11

你可能感兴趣的:(java事件机制(订阅/消费模型))