设计模式(二)观察者模式

观察者模式

观察者模式是一个很自然的设计,就像出版商和订阅用户之间的关系一样,主题和观察者之间也保证了低限度却又及时的交互。

当主题的内容更新时,主题就会将更新通知给其所有的观察者,观察者被动地从主题中获取更新的信息,且无法获得不属于其访问权限的信息。

当观察者对当前主题的信息不感兴趣时,就可以向主题请求注销,主题就会从自己的观察者名单中将其移除。当观察者对某一主题感兴趣时,只需向主题请求注册,主题就会将其加入自己的观察者名单。

松耦合

当两个对象之间松耦合,他们能够保持必需的交互,同时又不会过分了解彼此的细节。观察者模式正是利用了这一思想。当一个新的类作为观察者时,只需让这个类实现观察者接口即可,而不需要为这个类修改主题中的任何代码。

Java内置的观察者模式

Java中内置了Observer接口和Observable类。在这种实现中,主题不会主动推送所有的更新内容,而是将更新的内容打包(实际上是传递了整个主题)发送给每个观察者,每个观察者根据自己的需求获取打包的部分信息。

虽然这种实现使观察者能够更灵活地获取信息,但是也存在某些缺陷:

  1. 由于传递了打包的信息,这要求主题被设计为一个类而非接口,严重地限制了使用和复用性。如果一个类要作为观察者,它就不能在继承其他超类。
  2. 内置的设计将修改更新状态的方法保护了起来,这限制了主题与其他类的组合。

注意事项

在使用观察者模式时,必须令代码实现脱离对通知次序的依赖。否则,一旦修改实现导致通知的次序被改变了,就可能导致未知的错误。

例如:不能将流水线上的各个组件作为同一组观察者,因为组件之间存在依赖关系,若通知的顺序与流水线上的工作顺序不同,很可能导致工程停止运转。

设计原则

观察者模式中提出一种设计原则:关注交互对象之间的松耦合

猜你喜欢

转载自www.cnblogs.com/aries99c/p/12659279.html