介绍
- 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
- UML 图:如下。
从上图看出:
- 在主题对象(Subject)中存在一个观察者集合 observerCollection。
- 通过
registerObserver(observer)
将 observer 注册到 Subject;通过unregisterObserver(observer)
取消注册。 - 主题对象有一个
notifyObservers()
方法,当 Subject 对象状态发生变化时,就会主动调用该方法,通知注册在该对象的所有观察者调用notify()
。
因此可以看出:一个观察者可以注册到多个主体对象中,一个主体对象也可以有多个观察者。
实际应用:你在门上装了一个防盗装置,当门关的时候就开始监听门的状态(注册了一个观察者),当门打开时就发出警报(调用了 notify()
)。
Android 中的应用:ListView
在 ListView 中我们会调用 setAdapter(adapter)
设置 ListView 的具体内容,但是实际上这个方法中还新建了一个观察者,并注册在 adapter 上:
|
因此一个 ListView 中就有一个 AdapterDataSetObserver。当 adapter 内容发生改变时,开发者会调用 adapter.notifyDataSetChanged()
,这个方法的内部实现就是通知注册在 adapter 上的所有观察者调自己的 onChanged()
方法。