定义:
定义对象之间的一种一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
常见的例子:
上班合理摸鱼的例子
常见的问题:将一个系统分割成一系列相互协作的类有一个很好的副作用, 那就是需要维护相关对象之间的一致性。 我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。 —— 可以使用观察者解决
使用情况:
0》有两种抽象类型相互依赖。 将它们封装在各自的对象中,就可以对它们单独进行改变和复用。 【依赖】
1》 当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时。【因改变而改变你】
2》一个对象必须通知其他对象, 而它有不需要知道其他对象是什么 【改变其他对象不需要了解其他对象】
观察者模式所做的工作其实就是在解除耦合。 让耦合的双方都依赖于抽象,而不是依赖于具体。 从而使得各自的拜年话都有影响另一边的变化。
如果我们通过接口来实现这个观察者与主题者的时候,但是,很多时候观察者并不一定实现了这个接口呀!所以这个是有问题的。 【局限性】
可以使用了委托来解决通知的发送问题。
委托: 是一种引用方法的类型。 一旦为委托分配了方法,委托将与该方法具有相同的行为。 委托方法的使用可以像其他热呢和方法一样,具有参数和返回值。 委托可以看做是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。
一个委托可以搭载多个方法,所有方法被依次换气。 更重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。
委托对象锁搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数类表和返回值类型。
Cocoa Touch 框架使用的观察者
1)键值对观察 【观察者】
2)通知 【订阅】
通知代替KVO
- 需要为主题和观察者定义一个共同的标识符
- 当scribble的内部状态发生改变时,它会把带有指定 标识符的通知,使用任何必要的额对象作为参数投递到NSNotificationCenter
- 接下来,所有订阅了标有这个标识符提供给NSNotification的选择器中处理这一通知
- 然后观察者ui在作为回调函数提供给NSNotification的选择器中处理这一通知。
网友评论