观察者模式 -- Observer

2017-04-13 23:06:01   最后更新: 2017-04-13 23:06:01   访问数量:200




有时,多个对象需要依赖某个对象状态的变化,这就是典型的“发布-订阅”模式

这样的系统由一系列相互协作的类构成,如何处理一对多的耦合呢?观察者模式就是为了处理这样的场景而存在的

一个目标对象可能有任意数目的依赖他的观察者对象存在,一旦目标对象状态发生变化,则所有观察者都将接收到通知

 

观察者模式主要应用于以下场景:

  1. 一个对象的改变需要同时改变其他对象,而不知道具体有多少个对象有待改变
  2. 一个对象需要通知某个其他对象,但他不知道或不关心具体应该通知的对象是谁

 

 

 

如上图所示,观察者模式有以下组件构成:

  • Subject -- 被观察的目标对象,他可以拥有任意多个观察者,因此他需要提供注册和删除观察者对象的接口
  • Observer -- 观察者对象,为那些在目标发生改变时需要获得通知的对象定义一个更新接口
  • ConcreteSubject -- 具体的目标对象,Subject 的具体实现,他将调用具体的 Observer 对象的 update() 操作将状态转移到观察者对象
  • ConcreteObserver -- Observer 的具体实现,用来保存目标对象 ConcreteSubject 的状态

 

观察者模式具有以下优点:

  1. 目标对象与具体的观察者对象间的耦合降到了最低程度,目标对象并不知道任何一观察者所属的具体类
  2. 实现了广播通信,信息的发送者将无需指定他的接收者,所有注册过的观察者都将接收到广播消息

 

但是,一个观察者并不知道其他观察者的存在,因此他可能采取错误的方式响应目标对象的状态变化

 

观察者模式与中介者模式

观察者模式常常与中介者模式结合使用,他们两个的目标都是复杂系统的对象间解耦,如果中介者模式中的同事类作为观察者模式中的目标对象,而中介者对象则作为观察者模式中的观察者对象,那么,每当同事类发生状态变化或需要通信时,观察者都会自动实现消息的发送,从而实现解耦

中介者模式 -- Mediator

 

观察者模式与单例模式

如果观察者和目标对象的依赖关系特别复杂,有时需要一个维护这些关系的对象,我们称之为 ChangeManager 对象,他的目的是尽量减少观察者反映其目标状态变化所需要的工作,例如,有时一个操作涉及到几个相互依赖的目标对象的改变,ChangeManager 就负责仅在这些相互依赖的目标对象全部完成操作后再通知观察者,同时,观察者对象不再需要维护一个复杂的依赖关系而是仅需要依赖 ChangeManager 对象,系统从而变得简单,同时,ChangeManager 可以实现更新策略的维护或改变

ChangeManager 类通常使用单例模式创建

 






读书笔记      技术帖      龙潭书斋      java      广播      设计模式      design pattern      观察者      发布订阅      observer     


京ICP备15018585号