观察者模式 = 出版者+订阅者
= subject + Observer
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新
1.
——源代码返回最近的气象测量数据(温度、湿度、气压)
——getTemperature() / getHumidity() / getPressure()
——从气象站获取更新信息
——measurementsChanged()
——一旦WeatherData有新的测量,布告必须马上更新
——系统必须可扩展,建立定制的布告板,随心所欲添加删除任何其他布告板
public void measurementsChanged(){
}
-----> 针对具体实现编程,而不是针对接口
-----> 每个新的布告板都得修改代码
-----> 尚未封装改变的部分
-----> 无法在运行时动态添加删除布告板
2.
public interface Subject{
public void removeObserver(Observero);
public void notifyObserver(Observero);
}
public interface Observer{
}
public interface DisplayElement{
}
——主题必须主动送出状态和通知大家
——观察者主动索取数据,主题受到危险
——状态需要能“推”“拉”
设计原则:
当两个对象之间松耦合,依然可以交互,但是不太清楚彼此的细节——主题和观察者之间松耦合
找出程序中会变化的方面,将其和固定不变的方面相分离
针对接口编程,不针对实现编程
多用组合,少用继承
新类型的观察者出现时,主题的代码不需要修改;
独立地复用主题或观察者;
改变主题或者观察者一方,不会影响另一方;
松耦合设计让我们建立有弹性的OO系统,能够应该对变化,因为对象之间的互相依赖降到了最低。
3.
Observer是一个“类”,而不是一个接口
WeatherData继承了超类的register(), remove(), notifyObservers()
——把对象变成观察者:addObserver,deleteObserver
——主题送出通知:先调用setChanged(),notifyObservers()或notifyObservers(Object arg)
——观察者接收通知:update(Observable o, Objectarg)
——没有Observable接口,无法建立自己的实现,和Java内置的Observer API搭配使用,无法将java.util的实现转换成另一套做法的实现
——不要依赖观察者被通知的次序