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

2014-11-24 10:41:13 · 作者: · 浏览: 9
if (o instanceof Writer) {
Writer writer = (Writer) o;
System.out.println(name+"知道" + writer.getName() + "发布了新书《" + writer.getLastNovel() + "》,非要去看!");
}
}

}

//读者类,要实现观察者接口
public class Reader implements Observer{

private String name;

public Reader(String name) {
super();
this.name = name;
}

public String getName() {
return name;
}

//读者可以关注某一位作者,关注则代表把自己加到作者的观察者列表里
public void subscribe(String writerName){
WriterManager.getInstance().getWriter(writerName).addObserver(this);
}

//读者可以取消关注某一位作者,取消关注则代表把自己从作者的观察者列表里删除
public void unsubscribe(String writerName){
WriterManager.getInstance().getWriter(writerName).deleteObserver(this);
}

//当关注的作者发表新小说时,会通知读者去看
public void update(Observable o, Object obj) {
if (o instanceof Writer) {
Writer writer = (Writer) o;
System.out.println(name+"知道" + writer.getName() + "发布了新书《" + writer.getLastNovel() + "》,非要去看!");
}
}

}
下面是作者类。

[java]
//作者类,要继承自被观察者类
public class Writer extends Observable{

private String name;//作者的名称

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

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

//作者发布新小说了,要通知所有关注自己的读者
public void addNovel(String novel) {
System.out.println(name + "发布了新书《" + novel + "》!");
lastNovel = novel;
setChanged();
notifyObservers();
}

public String getLastNovel() {
return lastNovel;
}

public String getName() {
return name;
}

}

//作者类,要继承自被观察者类
public class Writer extends Observable{

private String name;//作者的名称

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

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

//作者发布新小说了,要通知所有关注自己的读者
public void addNovel(String novel) {
System.out.println(name + "发布了新书《" + novel + "》!");
lastNovel = novel;
setChanged();
notifyObservers();
}

public String getLastNovel() {
return lastNovel;
}

public String getName() {
return name;
}

}
然后我们还需要一个管理器帮我们管理这些作者。如下。

[java]
import java.util.HashMap;
import java.util.Map;

//管理器,保持一份独有的作者列表
public class WriterManager{

private Map writerMap = new HashMap();

//添加作者
public void add(Writer writer){
writerMap.put(writer.getName(), writer);
}
//根据作者姓名获取作者
public Writer getWriter(String name){
return writerMap.get(name);
}

//单例
private WriterManager(){}

public static WriterManager getInstance(){
return WriterManagerInstance.instance;
}
private static class WriterManagerInstance{

private static WriterManager instance = new WriterManager();

}
}

import java.util.HashMap;
import java.util.Map;

//管理器,保持一份独有的作者列表
public class WriterManager{

private Map writerMap = new HashMap();

//添加作者
public void add(Writer writer){
writerMap.put(writer.getName(), writer);
}
//根据作者姓名获取作者
public Writer getWriter(String name){
return writerMap.get(name);
}

//单例
private WriterManager(){}

public static WriterManager getInstance(){
return WriterManagerInstance.instance;
}
private static class WriterManagerIn