2019独角兽企业重金招聘Python工程师标准>>>
1、事件角色
java中的事件机制的参与者有3种角色:
- event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
- event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
- event listener:事件监听者。对每个明确的事件的发生,都相应地定义一个明确的Java方法。
2、Java 实现
主要的API:
- 事件状态类:java.util.EventObject
- 事件监听接口:java.util.EventListener
我们需要定义的类/接口有:
类名 | 功能 | 父类/父接口 |
事件状态类 | 持有事件触发改变的“状态属性” | EventObject |
事件监听接口 | 定义事件触发以后,根据不同状态属性的抽象操作方法 | EventListener |
具体的监听实现类(可以有多个) | 提供具体的,根据不同状态属性的操作 | 事件监听接口 |
事件源类 | 1、持有监听类,并提供注册功能 2、提供触发事件的功能,触发事件的同时,通知监听器
| 无 |
示例如下:
- 事件状态类:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
* 事件状态类
* 持有事件触发改变的“状态属性”
*/
public class EventState extends EventObject {
private String state;
public void setDoorState(String state) {
this.state = state;
}
public String getDoorState() {
return this.state;
}
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public EventState(Object source) {
super(source);
}
}
- 事件监听接口:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
* 事件监听接口
*/
public interface StateListener extends EventListener {
void doorEvent(EventState event);
}
- 事件源类:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
* 具体的事件源类
*
*/
public class EventSource {
private ConcurrentLinkedQueue<StateListener> listeners;
/**
* 添加监听
*/
public void addListener(StateListener stateListener) {
if (listeners == null) {
listeners = new ConcurrentLinkedQueue();
}
listeners.add(stateListener);
}
/**
* 移除监听
*/
public void removeListener(StateListener stateListener) {
if (listeners == null)
return;
listeners.remove(stateListener);
}
/**
* 触发事件,更改事件状态
*/
protected void fireStateChange(String doorState) {
if (listeners == null)
return;
EventState event = new EventState(this);
event.setDoorState(doorState);
notifyListeners(event);
}
/**
* 通知所有的DoorListener,让Listener对状态变化做出响应操作
*/
private void notifyListeners(EventState event) {
for(StateListener stateListener:listeners)
stateListener.doSomethingForEvent(event);
}
}
- 使用:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
*/
public class Test {
public static void main(String[] args) {
EventSource eventSource = new EventSource();
//添加一个监听,并同时定义根据事件状态变化做出的操作
eventSource.addListener(new ListenerA());
eventSource.fireStateChange("啦啦啦");
}
}
class ListenerA implements StateListener{
@Override
public void doSomethingForEvent(EventState event) {
String doorState = event.getDoorState();
System.out.println(doorState);
//触发事件以后,将自己移除
((EventSource)event.getSource()).removeListener(this);
}
}