观察者更多的强调的是发布-订阅式的问题处理,而事件驱动则更多的注重于界面与数据模型之间的问题。
tomcat是一个app服务器,在使用的过程中,或许经常会有人用到listener,即监听器这个概念。那么其实这个就是一个事件驱动模型的应用。比如我们的spring,我们在应用启动的时候要初始化我们的IOC容器,那么我们的做法就是加入一个listener,这样伴随着tomcat服务器的启动,spring的IOC容器就会跟着启动。
那么这个listener其实就是事件驱动模型中的监听器,它用来监听它所感兴趣的事,比如我们springIOC容器启动的监听器,就是实现的ServletContextListener这个接口,说明它对servletContext感兴趣,会监听servletContext的启动和销毁。
JDK当中依然有现成的一套事件模型类库,其中监听器只是一个标识接口,因为它没有表达对具体对象感兴趣的意思,所以也无法定义监听的事件,只是为了统一,用来给特定的监听器继承。它的源代码如下。
其中标注了,所有的事件监听器都必须继承,这是一个标识接口。
package java.util;
/**
* A tagging interface that all event listener interfaces must extend.
* @since JDK1.1
*/
public interface EventListener {
}
事件,JDK当中也有一个现成的类供继承,就是EventObject,这个类的源代码如下。
public class EventObject implements java.io.Serializable {
private static final long serialVersionUID = 5516075349620653480L;
/**
* The object on which the Event initially occurred.
*/
protected transient Object source;
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @exception IllegalArgumentException if source is null.
*/
public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");
this.source = source;
}
/**
* The object on which the Event initially occurred.
*
* @return The object on which the Event initially occurred.
*/
public Object getSource() {
return source;
}
/**
* Returns a String representation of this EventObject.
*
* @return A a String representation of this EventObject.
*/
public String toString() {
return getClass().getName() + "[source=" + source + "]";
}
}
这个类只是表明,所有的事件都应该带有一个事件源,大部分情况下,这个事件源就是我们被监听的对象。
我们还是以小说网的读者和作者为例,将其使用事件驱动模型来实现。采用事件驱动模型去分析,作者就是事件源,而读者就是监听器,依据这个思想,首先需要自定义我们自己的监听器和事件。
作者事件:
import java.util.EventObject;
public class WriterEvent extends EventObject{
private static final long serialVersionUID = 8546459078247503692L;
public WriterEvent(Writer writer) {
super(writer);
}
public Writer getWriter(){
return (Writer) super.getSource();
}
}
这代表了一个作者事件,这个事件当中一般就是包含一个事件源,在这里就是作者,当然有的时候你可以让它带有更多的信息,以方便监听器做出更加细致的动作。
定义作者监听器:
import java.util.EventListener;
public interface WriterListener extends EventListener{
void addNovel(WriterEvent writerEvent);
}
这个监听器猛地一看,特别像观