场景:读者订杂志,订报纸,当有新的期刊和版本来了,读者怎么知道?
1. 模式介绍
public class Subject {
//用来保存注册的观察者对象
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
//通知所有注册的观察者对象
protected void notifyObservers() {
for(Observer observer : observers){
observer.update(this);
}
}
}
public class ConcreteSubject extends Subject {
private String subjectState; //示意,目标对象的状态
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
//状态发生了改变,通知各个观察者
this.notifyObservers();
}
}
//观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象
public interface Observer {
//更新的接口
public void update(Subject subject);
}
public class ConcreteObserver implements Observer {
private String observerState; //示意,观者者的状态
public void update(Subject subject) {
// 具体的更新实现
//这里可能需要更新观察者的状态,使其与目标的状态保持一致
observerState = ((ConcreteSubject)subject).getSubjectState();
}
}
2. 应用到场景
public interface Observer {
//被通知的方法,直接把报纸的内容推送过来
public void update(String content);
}
public class Reader implements Observer{
//读者的姓名
private String name;
public void update(String content) {
//这是采用推的方式
System.out.println(name+"收到报纸了,阅读先。内容是==="+content);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Subject {
// 用来保存注册的观察者对象,也就是报纸的订阅者
private List<Observer> readers = new ArrayList<Observer>();
//报纸的读者需要先向报社订阅,先要注册
public void attach(Observer reader) {
readers.add(reader);
}
//报纸的读者可以取消订阅
public void detach(Observer reader) {
readers.remove(reader);
}
// 当每期报纸印刷出来后,就要迅速的主动的被送到读者的手中,
protected void notifyObservers(String content) {
for(Observer reader : readers){
reader.update(content);
}
}
}
public class NewsPaper extends Subject{
private String content; //报纸的具体内容
public String getContent() {
return content;
}
//示意,设置报纸的具体内容,相当于要出版报纸了
public void setContent(String content) {
this.content = content;
//内容有了,说明又出报纸了,那就通知所有的读者
notifyObservers(content);
}
}
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("本期内容是观察者模式");
}
}