黑马程序员: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