1. 背景
书中以实现一个气象检测应用为例,逐步引出了观察者模式在该事例中的应用。要求利用已有的WeatherData对象来获取天气数据,然后通知布告板更新数据,其中有多种类型的布告板用来在不同的终端上以多种形式展示天气数据。
2.分析过程
书中拿报纸、杂志的订阅来类比观察者模式。订阅报纸大致分如下几个过程:
(1) 报社专门出版各种各样的报纸、杂志。
(2) 用户对某些报纸、杂志感兴趣,想在这些报纸有更新后能够收到报社提供的最新报纸。于是用户向报社注册,希望能够收到新出版的报纸。
(3) 当报社新出版报纸后,便查询有哪些用户订阅了报纸,并向他们投递他们订阅的报纸。
(4) 当用户不想再继续收到订阅的报纸后,可以向报社提出取消订阅。
由此和报纸的订阅过程类比过来,引出观察者模式的概念。同时解释观察者模式中的两个名词:主题(Subject)和观察者(Observer)。一个观察者对一类信息比较感兴趣,于是它可以将自己注册给他关心的主题,当主题检测到观察者关心的事件发生了,便逐个通知已经注册了的观察者,并给他们传递他们所关心的数据。
3.定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象个改变状态时,它所有依赖着都会收到通知并自动更新。
4.引出类图
在Subject中保持对Observer数组的引用,当事件发生后,从数组中取出Observer调用他们的update方法来更新数据。这样,Subject就并不需要知道具体的Observer类,只知道它们实现了Observer接口,如果有新的类型的Observer出现时,Subject的代码并不用修改,而且改变Subject或者Observer,并不会影响另一方,达到了松耦合的目的。从而引出了一条设计原则:
为交互对象之间的送耦合设计而努力。
5.代码片段
<pre name="code" class="java">public class WeatherData implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void registerObserver(Observer o) {
if(null == o)
return;
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void norifyObservers() {
for(Observer o : observers){
o.update();
}
}
}