1 主要角色
1.1 事件源(Source)
触发事件的对象,不需要实现或继承任何接口或类。
因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。
1.2 事件(EventObject)
java.util.EventObject 是事件状态对象的基类,封装了事件源对象以及和事件相关的信息。
所有java的事件类都需要继承该类。
1.3 事件监听器(Eventlistener)
java.util.EventListener 是一个无方法的标记接口。所有事件监听器都需要实现该接口。
事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。
2 原理
2.1 实现过程
- 为要触发事件的 Source 定义 EventObject;
- 为 EventObject 定义 Eventlistener;
- 定义 Source 的类,指定添加 Eventlistener 的方法。
2.2 触发过程
- Source 用自身创建一个 EventObject
- 将 EventObject 传入 Source 注册的 Eventlistener 中
- 在 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();
}
}