【Head First设计模式-读书笔记】观察者模式
观察者模式的定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
体现的设计原则是:为了交互对象之间的松耦合设计而努力。
每个观察者都必须实现观察接口的目的是使每个观察者都可以存放到主题的容器中,这样主题通知每个不同的观察者的时候就不需要去在意各个观察者的内部实现只需要调用同一方法。
观察者模式有两种不同的情况:
* 推送(push):由主题把所有信息推送给观察者,这种方式不够灵活。比如某个观察者只需要推送中的某一个数据,那它同样必须接受所有数据。
* 拉(pull) :当主题的信息发生改变的时候就通知各个观察值但是不向它们推送变化数据,同时主题必须提供一些公开的get方法,当观察者接到变化通知是就向主题拉取需要的数据。
其实在java中已经有内置的观察者模式。java.util中的Observable(类)和Observer(接口)。但是缺点不少,例如违反了:针对接口变成,而不是针对实现编程和多用组合少用继承两个原则,而且起nofify也依赖顺序。
观察者模式的要点
- 观察者定义了对象之间一对多的关系。
- 主题用一个共同的接口来更新观察者。
- 观察者和可观察者之间用松耦合方式结合,主题不知道观察者的细节,只知道观察者实现了观察者接口。
- 可以从可观察者推或者拉数据。
- 有多个观察者时,不可以依赖特定的通知次序。
- 要注意java.util.Observable实现上带来的问题。
- 如果有必要的话,可以实现自己的Observable。
观察者模式的应用
观察者模式的优点
- 观察者和可观察者之间是抽象耦合
- 建立了一套完整的触发链
观察者模式的缺点
- 多级触发的效率问题
- Java中消息的通知默认是顺序执行的,一个观察者卡壳,会影响整体的效率
观察者模式的使用场景
- 可拆分的关联行为场景
- 事件多级触发的场景
- 跨系统的消息交换场景