事件

Wu Jun 2020-01-03 13:43:49
Categories: > > Tags:

1 主要角色

1.1 事件源(Source)

触发事件的对象,不需要实现或继承任何接口或类。

因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。

1.2 事件(EventObject)

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

1.3 事件监听器(Eventlistener)

java.util.EventListener 是一个无方法的标记接口。所有事件监听器都需要实现该接口。

事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。

2 原理

2.1 实现过程

  1. 为要触发事件的 Source 定义 EventObject;
  2. 为 EventObject 定义 Eventlistener;
  3. 定义 Source 的类,指定添加 Eventlistener 的方法。

2.2 触发过程

  1. Source 用自身创建一个 EventObject
  2. 将 EventObject 传入 Source 注册的 Eventlistener 中
  3. 在 Eventlistener 中根据 Source 选择执行某段代码

三 示例

3.1 事件对象

public class MyEvent extends EventObject {
    private Source source;
    public MyEvent(Object source) {
        super(source);
        this.source = source;
    }
    public int getSource() {
        return source;
    }
}

3.2 事件监听器

public class MyListener implements EventListener {
    public void handleEvent(MyEvent event) {
        Source source = event.getSource();
    }
}

3.3 事件源

public class Source {
    Set<MyListener> listeners = new HashSet<MyListener>();
    //注册监听器
    public void addListener(MyListener listener) {
        listeners.add(listener);
    }
    //通知监听器
    public void notifyListener() {
        for (EventListener listener : listeners) {
            ((MyListener)listener).handleEvent(new MyEvent(this));
        }
    }
}

3.4 测试类

public class Test {
    public static void main(String[] args) {
        Source source = new Source();
        source.addListener(new StateChangeListener());
        source.notifyListener();
    }
}