定义
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新.
模式特点
- 观察者模式定义了对象间
一对多的关系. -
主题可以通过一个接口来更新观察者. - 观察者和可观察者之间通过
松耦合的方式结合,可观察者不知道观察者的实现细节,只知道观察者实现了相应的接口. - 有多个观察者时,不可以依赖特定的通知
顺序,这个顺序和语言自身的实现有关. - 当观察者取消
订阅时,他将不再收到主题发出的消息.
个人理解
看完立刻让我联想到了OC中的KVO和通知,仔细想了想他们确实都满足上面的特点,一对多,松耦合,改变后能够传递消息.那再仔细想一想,协议和block算吗?写起来吧,对他们进行改造其实也能够实现,但是这本身其实没什么意义,因为OC提供给我们的这两种常用的方式其实已经算是很不错的一种方式了,这里不会对KVO和通知如何去使用做过多的阐述.
一直在接触的RAC这种框架其实在我看来也是蛮像的,但他有个优点,我们可以在主题方先行结束订阅,也可以在订阅者方提前结束,并且通过函数式的优点,我们可以在时间和空间上对信号进行控制,比如节流和忽略相关信息,这其实在我看来都是一定程度上在观察者模式方向上的一定优化和扩展.
书中还扩展了我们的观察者不应仅仅只是被动地接收主题发送的信息,还可以主动的去拉取,写法大概上相当于声明一个BOOL值,当要观察的对象(OC中可以通过set方法触发),当我们主动去拉取的时候,改变这个BOOL值此时才可以让通知或者KVO发憷值,发出完再去更改这个BOOL值,这样只有我们每次去拉取的时候他才会发送一次.
观察者模式在OC中的个人猜测实现
- 1 主题中应该有一个
数组来存储自己所需要通知的对象,观察者通过订阅主题来将自己添加到主题的数组中. - 2 当需要通知时,
主题会遍历这个数组,给每一个对象发送消息. - 3取消订阅时,
主题将观察者从数组中移除,以后就不会再发送了. - 4
观察者被销毁的时候,一定要取消订阅,否则当主题再次发送消息时,会因为观察者已经不在了而导致crash,这里调试起来还相当的困难,希望各位养成习惯吧(ps:一般老手这都是习惯了)