1:Subject.java
package cn.javass.dp.observer.example2;
import java.util.ArrayList;
import java.util.List;
/**
* 目标对象,作为被观察者
*/
public class Subject {
/**
* 用来保存注册的观察者对象,也就是报纸的订阅者
*/
private List<Observer> readers = new ArrayList<Observer>();
/**
* 报纸的读者需要先向报社订阅,先要注册
* @param reader 报纸的读者
* @return 是否注册成功
*/
public void attach(Observer reader) {
readers.add(reader);
}
/**
* 报纸的读者可以取消订阅
* @param reader 报纸的读者
* @return 是否取消成功
*/
public void detach(Observer reader) {
readers.remove(reader);
}
/**
* 当每期报纸印刷出来后,就要迅速的主动的被送到读者的手中,
* 相当于通知读者,让他们知道
*/
protected void notifyObservers() {
for(Observer reader : readers){
reader.update(this);
}
}
}
2:client
package cn.javass.dp.observer.example2;
public class Client {
public static void main(String[] args) {
//创建一个报纸,作为被观察者
NewsPaper subject = new NewsPaper();
//创建阅读者,也就是观察者
Reader reader1 = new Reader();
reader1.setName("张三");
Reader reader2 = new Reader();
reader2.setName("李四");
Reader reader3 = new Reader();
reader3.setName("王五");
//注册阅读者
subject.attach(reader1);
subject.attach(reader2);
subject.attach(reader3);
//要出报纸啦
subject.setContent("本期内容是观察者模式");
}
}
3:NewsPaper
package cn.javass.dp.observer.example2;
import java.util.*;
/**
* 报纸对象,具体的目标实现
*/
public class NewsPaper extends Subject{
/**
* 报纸的具体内容
*/
private String content;
/**
* 获取报纸的具体内容
* @return 报纸的具体内容
*/
public String getContent() {
return content;
}
/**
* 示意,设置报纸的具体内容,相当于要出版报纸了
* @param content 报纸的具体内容
*/
public void setContent(String content) {
this.content = content;
//内容有了,说明又出报纸了,那就通知所有的读者
notifyObservers();
}
}
4:Observer
package cn.javass.dp.observer.example2;
/**
* 观察者,比如报纸的读者
*/
public interface Observer {
/**
* 被通知的方法
* @param subject 具体的目标对象,可以获取报纸的内容
*/
public void update(Subject subject);
}
5:Reader
package cn.javass.dp.observer.example2;
/**
* 真正的读者,为了简单就描述一下姓名
*/
public class Reader implements Observer{
/**
* 读者的姓名
*/
private String name;
public void update(Subject subject) {
//这是采用拉的方式
System.out.println(name+"收到报纸了,阅读先。内容是==="+((NewsPaper)subject).getContent());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}