观察者模式:定义了对象间的一对多依赖,当一个对象有新的消息,所有与之关联的对象都将得到通知。这是一个非常常用的模式,它能使我们的对象知悉现状。就像报社与订报人之间的关系:
- 用户可以随时决定订阅或取消订阅。
- 一旦用户订阅了报纸,那么新一期的报纸只要一出版就会被送上门。
为了展示这个模式的应用,我们假设有两个类:Observer和Suject(被观察者,主题)。
- 需要维护一个列表,由所有的Observer组成。
- 实现addObserver/removeObserver实现观察者的注册和注销
- 实现notifyObserver方法,每当出现新的消息,我们遍历已注册的Observer列表,并逐一通知它们(调用他们的update方法)
- 为了把自己注册到感兴趣的Subject上,需要调用Subject的addObserver方法,为此可以将Subject作为构造参数,也可以使用其他方法。
- 实现update方法,供Subject调用,即在有新消息时作何处理。
- 不再对此Subject感兴趣时可以把自己从Subject注销,使用Subject的removeObserver方法。
Java中对观察者模式提供了内置支持:Obserser类可以实现接口java.util.Observer; Subject类可以扩展java.util.Observable类。
- Observable是一个类而不是接口,这使得我们不得不通过继承它来使用,而java是不支持多继承的,当我们需要另一个基类时这有可能带来不便。
- 根据java中的实现,列表中的observer对象被通知的顺序是不确定的,我们不能依赖这一顺序。
总之,有必要时请自行实现这一模式,它并不太复杂!