1.定义:
观察者:Observer
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
2.为什么?
设想一个场景:农场有一个布告板,显示了来自远程气象台的气温,湿度等。而远程气象台的数据不定时的更新,农场的布告板当然要随之变化了。
如果是一个布告板,那还好,如果10个、20个的话,那真的hold不住拉,要每个都去调整。
3.怎么做?
我们抽象出几个概念:
订阅主题:在这里是我们的远程气象台。
观察者:这里是我们的农场的
布告板
。
我们有一个思维,
观察者是依赖于主题的,他们有自己订阅的主题,这里存在一对多的联系,
当订阅的主题改变了的话,主题会通知各个观察者。也就是说,当气象台的温度和湿度更新之后,农场中的各个布告板都能得到通知和更新。
主题:Subject
public interface Subject {
// 注册观察者
public void registerObserver(Observer o);
// 移除观察者
public void removeObserver(Observer o);
// 通知所有观察者
public void notifyObservers();
}
观察者:Observer
public interface Observer {
public void update(float temp, float humidity);
}
远程气象台:RemoteObservatory
/**
* 远程气象台
* @author chenxinyi2
*
*/
public class RemoteObservatory implements Subject {
private List<Observer> observers;
private float temp;
private float humidity;
public RemoteObservatory() {
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
// 测量完成后
public void mesureComplete(float temp, float humidity) {
this.temp = temp;
this.humidity = humidity;
notifyObservers();
}
@Override
public void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
Observer observer = observers.get(i);
observer.update(temp, humidity);
}
}
}
我们的具体观察者:天气布告板
public class WeatherDisplay implements Observer {
private Subject subject;
private float temp;
private float humidity;
public WeatherDisplay(Subject subject) {
this.subject = subject;
this.subject.registerObserver(this);
}
@Override
public void update(float temp, float humidity) {
this.temp = temp;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("温度:" + temp + ",湿度:" + humidity);
}
}
Main函数:
public class ObserverMain {
public static void main(String[] args) {
RemoteObservatory observatory = new RemoteObservatory();
WeatherDisplay display = new WeatherDisplay(observatory);
observatory.mesureComplete(12.5f, 22.5f);
}
}