事件监听器机制是观察者模式的一种,通过把事件源和事件处理流程以监听器的方法隔离开来,减小了主流程与被触发事件的执行流程间的耦合,便于代码的维护和对事件处理流程的扩展。
在事件监听机制中,涉及到三个角色:事件、发布者和监听器
事件:在事件源和事件监听器之间传递信息的对象实体。
发布者:在事件发生后,负责把事件发布到监听者的对象。
监听者:监听事件,并进行事件处理或转发的对象。
Java中提供了事件监听器实现的框架,使用Java中的事件监听器,需要熟悉以下几个类或接口:
1. EventObject:事件的基类,在Java中自定义事件时需要继承的基类,其定义了事件源——Object类型的属性,可以把发生事件所在的类实例的引用传递过来,以便于在事件处理流程中使用(如果有使用要求的话)。在自定义的事件中,还可以定义自己应用所需的其他属性。
2. EventListener:自定义事件监听器必须实现的接口,没有具体方法,只起到标识作用。
Java事件的简单实现如下(代码参考Spring揭秘中自定义事件):
1. 定义事件:
2. 定义监听器接口及其实现
监听器接口:
监听器实现:
3. 定义发布者
4. 主流程发布事件:
上面只是java事件监听器的最简单的实现,在实际应用中还需要根据需要,定义适合的EventObject及处理流程。
在事件监听机制中,涉及到三个角色:事件、发布者和监听器
事件:在事件源和事件监听器之间传递信息的对象实体。
发布者:在事件发生后,负责把事件发布到监听者的对象。
监听者:监听事件,并进行事件处理或转发的对象。
Java中提供了事件监听器实现的框架,使用Java中的事件监听器,需要熟悉以下几个类或接口:
1. EventObject:事件的基类,在Java中自定义事件时需要继承的基类,其定义了事件源——Object类型的属性,可以把发生事件所在的类实例的引用传递过来,以便于在事件处理流程中使用(如果有使用要求的话)。在自定义的事件中,还可以定义自己应用所需的其他属性。
2. EventListener:自定义事件监听器必须实现的接口,没有具体方法,只起到标识作用。
Java事件的简单实现如下(代码参考Spring揭秘中自定义事件):
1. 定义事件:
package com.nuc.event;
import java.util.EventObject;
/**
* 定义事件对象,在该事件中除了继承自父类EventObject的source属性外,还自定义了
* 其他的一些属性
*/
public class MethodExecutionEvent extends EventObject {
private static final long serialVersionUID = -641456338528520034L;
private String methodName;
private MethodExecutionStatus methodExecutionStatus;
public MethodExecutionEvent(Object source) {
super(source);
}
public MethodExecutionEvent(Object source, String methodName, MethodExecutionStatus methodExecutionStatus) {
super(source);
this.methodName = methodName;
this.methodExecutionStatus = methodExecutionStatus;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public MethodExecutionStatus getMethodExecutionStatus() {
return methodExecutionStatus;
}
public void setMethodExecutionStatus(MethodExecutionStatus methodExecutionStatus) {
this.methodExecutionStatus = methodExecutionStatus;
}
}
2. 定义监听器接口及其实现
监听器接口:
package com.nuc.listener;
import java.util.EventListener;
import java.util.EventObject;
public interface MethodExecutionEventListener extends EventListener {
void onMethodExecute(EventObject event);
}
监听器实现:
package com.nuc.listener;
import java.util.EventObject;
import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
/**
* 事件监听器,定义当事件发生时会触发的动作。但这里的事件处理流程并不会被
* 事件源所在执行流程直接调用,而通过第三者——发布者把事件传递过来
*/
public class MethodExecutionEventListenerImpl implements
MethodExecutionEventListener {
public void onMethodExecute(EventObject event) {
if (event instanceof MethodExecutionEvent) {
if (MethodExecutionStatus.BEGIN.equals(((MethodExecutionEvent)event).getMethodExecutionStatus())) {
System.out.println("invoke start...");
}
if (MethodExecutionStatus.END.equals(((MethodExecutionEvent) event).getMethodExecutionStatus())) {
System.out.println("method end...");
}
}
}
}
3. 定义发布者
package com.nuc.publisher;
import java.util.EventObject;
import com.nuc.listener.MethodExecutionEventListener;
import com.nuc.listener.MethodExecutionEventListenerImpl;
/**
* 对事件触发流程和事件执行流程进行解耦的重要组件,负责把把事件发布到监听器里。
* 所谓的发布即是把事件传递给监听器。
*/
public class EventPublisher {
private MethodExecutionEventListener listener = new MethodExecutionEventListenerImpl();
public void publishEvent(EventObject event) {
listener.onMethodExecute(event);
}
}
4. 主流程发布事件:
package com.nuc;
import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
import com.nuc.publisher.EventPublisher;
public class App
{
public static void main( String[] args )
{
new EventPublisher().publishEvent(new MethodExecutionEvent("ok", "main", MethodExecutionStatus.BEGIN));
new EventPublisher().publishEvent(new MethodExecutionEvent("ok", "main", MethodExecutionStatus.END));
}
}
上面只是java事件监听器的最简单的实现,在实际应用中还需要根据需要,定义适合的EventObject及处理流程。