今天在做项目时候,用到观察者模式。使用起来还不是很顺溜,解读了几篇文章后,在我印象中观察者模式是这样的。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
从网上看到一个类图来展示观察者模式。感觉说的很详细,也容易懂,大家可以参考下图来理解观察者模式。
ConcreteSubject类继承自Subject类,属于抽象通知者,相当于发信号的人。ConcreteObserver继承Observer属于信号的接收者。观察者模式,不希望为了维持一致性而使类紧密耦合,这样给维护、扩展和重用带来不便。一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道谁是它的观察者。而任何一个具体观察者不知道也不需要知道其他观察者的存在。当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑观察者模式。
观察者模式所做的工作其实就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
Key-Value Observing(KVO)实现
熟悉KVO的朋友都知道,只有当我们调用KVC去访问key值的时候KVO才会起作用。所以肯定确定的是,KVO是基于KVC实现的。因为KVC的实现机制,可以很容易看到某个KVC操作的Key,而后也很容易的跟观察者注册表中的Key进行匹对。假如访问的Key是被观察的Key,那么我们在内部就可以很容易的到观察者注册表中去找到观察者对象,而后给他发送消息。
参考链接:http://www.ohcoder.com/post/2012-03-12/15755494