黑马程序员:Java培训、Android培训、iOS培训、.Net培训

              黑马程序员--观察者模式

一、定义

        定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。

二、观察者模式类图

   

     1)一个ConcreteSubject可以有任意个观察者,并且当ConcreteSubject发生任何可能导致观察者或其本身状态不一致的改变时,它调用notify()通知它的各个观察者。

     2)每个ConcreteObserver必须绑定一个ConcreteSubject,并且应当将每个ConcreteObserver添加到其相应的ConcreteSubject的观察者列表中。

     3)notify()既可以被ConcreSubject对象调用,也可以被ConcreteObserver对象调用。

三、适用性

    1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们能够各自独立的改变和复用。

2、当一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。

3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,就是希望这些对象不是紧密耦合的。

 四、使用观察者模式需要考虑的问题

    1、创建目标到其观察者之间的映射,方法有两种

          (1)在ConcreteSubject中显式地保存所有依赖其的ConcreteObserver。

          (2)使用关联查找机制(例如hash表)来维护目标到观察者的映射

    2、观察多个目标

           在有些情况下,一个观察者依赖于多个目标可能是有意义的。例如,一个表格对象可能依赖于多个数据源。可通过扩展update()使观察者知道是哪个目标送来的通知。

    3、谁触发更新

           目标和它的观察者依赖于通知机制来保持一致。有两个选择:

(1)由目标对象的状态设定操作在改变目标对象的状态后自动调用notify()。缺点是多个连续的操作会产生多次连续的更新,效率低。

(2)让客户负责在适当的时候调用notify()。缺点是给客户增加了触发更新的责任,容易出错。

   4、对已删除目标的悬挂引用

         删除一个目标时,不要在其观察者遗留对该目标的悬挂引用,应当让目标通知它的观察者对该目标引用复位。而一般而言,不能简单删除观察者,因为其他对象引用它们或还在观察其他目标。

   5、在发出通知前确保目标的状态自身是一致的

         原因是观察者在更新其状态的过程中需要查询目标的当前状态。可以使用模板方法模式来发送通知以避免这种错误。

   6、避免特定于观察者的更新协议――推/拉模型

   7、显式指定感兴趣的改变

          可以扩展目标的注册接口,让各个观察者注册为仅仅对特定事件感兴趣,以提高更新的效率。

   8、封装复杂的更新语义

 

写在模式之前:http://www.cnblogs.com/oo-lab/articles/4593399.html

策略模式:http://www.cnblogs.com/oo-lab/articles/4593407.html
迭代器模式:http://www.cnblogs.com/oo-lab/articles/4593416.html
观察者模式:http://www.cnblogs.com/oo-lab/articles/4593418.html
命令模式:http://www.cnblogs.com/oo-lab/articles/4593425.html
模板方法模式:http://www.cnblogs.com/oo-lab/articles/4593428.html
状态模式:http://www.cnblogs.com/oo-lab/articles/4593429.html

单件模式:http://www.cnblogs.com/oo-lab/articles/4593432.html
工厂方法模式:http://www.cnblogs.com/oo-lab/articles/4593435.html
抽象工厂模式:http://www.cnblogs.com/oo-lab/articles/4593440.html
生成器模式:http://www.cnblogs.com/oo-lab/articles/4593444.html