(六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型) (七)

2014-11-24 10:41:13 · 作者: · 浏览: 7
public Writer getWriter(){
return (Writer) super.getSource();
}

}
这代表了一个作者事件,这个事件当中一般就是包含一个事件源,在这里就是作者,当然有的时候你可以让它带有更多的信息,以方便监听器做出更加细致的动作。下面我们定义如下监听器。

[java]
import java.util.EventListener;

public interface WriterListener extends EventListener{

void addNovel(WriterEvent writerEvent);

}

import java.util.EventListener;

public interface WriterListener extends EventListener{

void addNovel(WriterEvent writerEvent);

} 这个监听器猛地一看,特别像观察者接口,它们承担的功能是类似的,都是提供观察者或者监听者实现自己响应的行为规定,其中addNovel方法代表的是作者发布新书时的响应。加入了这两个类以后,我们原有的作者和读者类就要发生点变化了,我们先来看作者类的变化。

[java]
import java.util.HashSet;
import java.util.Set;

//作者类
public class Writer{

private String name;//作者的名称

private String lastNovel;//记录作者最新发布的小说

private Set writerListenerList = new HashSet();//作者类要包含一个自己监听器的列表

public Writer(String name) {
super();
this.name = name;
WriterManager.getInstance().add(this);
}

//作者发布新小说了,要通知所有关注自己的读者
public void addNovel(String novel) {
System.out.println(name + "发布了新书《" + novel + "》!");
lastNovel = novel;
fireEvent();
}
//触发发布新书的事件,通知所有监听这件事的监听器
private void fireEvent(){
WriterEvent writerEvent = new WriterEvent(this);
for (WriterListener writerListener : writerListenerList) {
writerListener.addNovel(writerEvent);
}
}
//提供给外部注册成为自己的监听器的方法
public void registerListener(WriterListener writerListener){
writerListenerList.add(writerListener);
}
//提供给外部注销的方法
public void unregisterListener(WriterListener writerListener){
writerListenerList.remove(writerListener);
}

public String getLastNovel() {
return lastNovel;
}

public String getName() {
return name;
}

}

import java.util.HashSet;
import java.util.Set;

//作者类
public class Writer{

private String name;//作者的名称

private String lastNovel;//记录作者最新发布的小说

private Set writerListenerList = new HashSet();//作者类要包含一个自己监听器的列表

public Writer(String name) {
super();
this.name = name;
WriterManager.getInstance().add(this);
}

//作者发布新小说了,要通知所有关注自己的读者
public void addNovel(String novel) {
System.out.println(name + "发布了新书《" + novel + "》!");
lastNovel = novel;
fireEvent();
}
//触发发布新书的事件,通知所有监听这件事的监听器
private void fireEvent(){
WriterEvent writerEvent = new WriterEvent(this);
for (WriterListener writerListener : writerListenerList) {
writerListener.addNovel(writerEvent);
}
}
//提供给外部注册成为自己的监听器的方法
public void registerListener(WriterListener writerListener){
writerListenerList.add(writerListener);
}
//提供给外部注销的方法
public void unregisterListener(WriterListener writerListener){
writerListenerList.remove(writerListener);
}

public String getLastNovel() {
return lastNovel;
}

public String getName() {
return name;
}

} 可以看到,作者类的主要变化是添加了一个自己的监听器列表,我们使用set是为了它的天然去重效果,并且提供给外部注册和注销的方法,与观察者模式相比,这个功能本身是由基类Observable提供的,不过观察者模式中有统一的观察者Observer接口,但是监听器没有,虽说有EventListener这个超级接口,但它毕竟没有任何行为。所以我们一般需要维持一个自己特有的监听器列表。

下面我们看读者类的变化,如下。

[java]
public class Reader implements WriterListener{

private String name;

public Reader(String name) {