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