设计模式--观察者模式
《Head First 设计模式》
1.观察者模式:定义了对象之间的一对多依赖,这样一来,当一个(主题)对象改变状态时,它的所有依赖都会收到通知并自动更新。
我喜欢看报纸,于是我订阅了《人民日报》。那么,《人民日报》每次的新闻都会告诉我(谁让我买了报那)。
a. 这个报社不仅仅我一个人订阅。(报社与我(对象之间)是一对多的依赖)。
b.报社每天的更新信息(一个(主题)对象改变了状态)。
c.报社把信息发给每个人订阅的人,这样订阅的人就可以更新时事(它的所有依赖都会收到通知并自动更新)。
现在很清晰了,把《人民日报》看做主题,我(以及其他订阅报纸的人)就是观察者。作为观察者,我不需要了解《人民日报》出版社的信息(主题的具体信息)。
我就知道《人民日报》更新了信息会告诉我。《人民日报》出版社也没心思了解我,他就知道有一个人订阅了该报,然后发行报纸的时候给我一份就可以了。
设计原则:找出程序中变化的方面,然后将其和固定不变的方面相分离。
我和《人民日报》是一种十分松散的耦合。假如我不再订阅《人民日报》,他也不需要修改内容(观察者放弃观察这个主题,主题也不需要修改代码去针对该观察者)。
《人民日报》只不过知道有个人不再订阅,以后不用发报纸给他了(主题把记录的观察者对象删除)。
主题的内容发生改变的时候,不需要修改观察者。观察者的数量等发生改变的时候,不需要修改主题。
设计原则:针对接口编程,而非针对实现编程。
把观察者统一实现一个接口,主题只需要向该接口实现内容,而不需要面向每个观察者。
订阅的人太多了,要是能统一管理就好了。于是,有了报刊(接口),出版社只需要针对报刊发布报纸就可以了,不需要繁琐的向每个人发报。(该例可能不太好)
小结:
- 观察者模式定义了对象之间一对多的关系。
- 主题用一个共同的接口来更新观察者。
- 观察者和主题之间松散耦合,主题不知道观察者的细节。
- 使用次模式时,也可以运行观察者主动去拿自己的信息,但是最好还是主题推送数据。
- 有多个观察者时,币可以依赖特定的通知顺序。
- java有多种观察者模式的实现,包括了通用的java.util.Observable。该类可以方便的实现观察者模式。
- java.util.Observable违反了:针对接口编程。所以有自己的局限性。
- 有必要可以自己实现该模式,很简单。
- Swing中也被大量使用该模式,就行按钮的监听。