行为型模式--Observer模式(观察者)对象行为型模式
一. 意图
定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 这一模式中的关键对象是目标(subject)和观察者(observer). 一个目标可以有任意数目的依赖它的观察者. 一旦目标的状态发生改变, 所有的观察者都得到通知. 作为对这个通知的响应, 每个观察者都将查询目标以使其状态与目标的状态同步.
Web中的MVC, MFC中的文档视图都是这个模式.
二. 适用性
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面. 将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变.
当一个对象必须通知其它对象, 而它又不能假定其它对象是谁. 换言之, 你不希望这些对象是紧密耦合的.
三. 模式结构
图1
四. 角色说明
Subject(目标)
—目标知道它的观察者. 可以有任意多个观察者观察同一个目标.
—提供注册和删除观察者对象的接口.
Observer(观察者)
—为那些在目标发生改变时需获得通知的对象定义一个更新接口.
ConcreteSubject(具体目标)
—将有关状态存入各ConcreteObserver对象.
—当它的状态发生改变时, 向它的各个观察者发出通知.
ConcreteObserver(具体观察者)
—维护一个指向ConcreteSubject对象的引用.
—存储有关状态,这些状态应与目标的状态保持一致.
—实现Observer的更新接口以使自身状态与目标的状态保持一致.
交互
图2
1:SetState()触发2:Notify()调用, 但是1:SetState()并不是一定由Observer来调用的. 但在视图文档结构中, 用户通常通过视图来改变文档的状态, 而视图就是Observer.
五. 说明
1. Observer模式允许你独立的改变目标和观察者. 你可以单独复用目标对象而无需同时复用其观察者, 反之亦然. 它也使你可以在不改动目标和其他的观察者的前提下增加观察者.
2. 目标和观察者间的抽象耦合, 目标不知道任何一个观察者属于哪一个具体的类. 这样目标和观察者之间的耦合是抽象的和最小的.
3. 支持广播通信. 不像通常的请求, 目标发送的通知不需指定它的接收者. 目标对象并不关心到底有多少对象对自己感兴趣; 它唯一的责任就是通知它的各观察者. 这给了你在任何时刻增加和删除观察者的自由.
4. 意外的更新 因为一个观察者并不知道其它观察者的存在, 它可能对改变目标的最终代价一无所知. (可以对Update定义一系列的类型, 这是这样会破坏该模式的灵活性, 特别是在增加Update类型时.)(也可以这样, 在绑定Observer对象时, 加入该对象感兴趣的Update, 在Notify的中Update前进行判断)
六. 我的理解
1. 文档视图就是使用了Observer模式, 我们要注意的是Subject中Observer的管理. SetState后Notify的中Update的判断.