搜索
您的当前位置:首页正文

设计模式 - 观察者模式

来源:二三娱乐

观察者模式的定义

观察者模式简述

MVC是由各种复杂的设计模式组合而成的复合结构,观察者是其中的设计模式之一。视图与控制器联系在一起,等待会影响应用程序表现的事件发生。例如,当用户单击视图上的排序按钮时,事件会传递给控制器,模型在后台排序完毕后,会通知所有相关的控制器,让它们用新的数据更新视图。
在MVC中使用观察者模式,每个组件都能够被独立复用与扩展,而对关系中的其他组件没有太多干扰。所得到的高度可复用性与可扩展性,是把其全部逻辑放入一个类中所无法得到的。因此,向控制器添加额外的视图时,不用修改已有的设计和代码。同样,不同的控制器可以使用同一个模型,而不用对使用它们的其他控制器做修改。

什么时候使用观察者模式:

  • 有两种抽象类型相互依赖,将他们封装在各自的对象中,就可以对它们单独进行改变和复用
  • 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
  • 一个对象必须通知其他对象,而它又不知道其他对象是什么

Cocoa 的观察者模型

  • NSNotificationCenter(消息中心)
  • KVC&KVO

NSNotification更重量级一些,除了监听外,还需负责传递信息等。

KVC

基本概念

KVC = "Key-Value Coding"

key是一个字符串来标识对象的特定属性。通常,一个key对应一个访问器方法的名称或接收对象的实例变量。key必须使用ASCII编码,以小写字母开头,不包含空格。

key path : 是一个字符串键,用于指定一个对象属性的遍历序列。序列中的第一个键的性质是相对的接收者,并且每个后续key和前一个属性的值相对。

常用API形式:

valueForKey: 
valueForKeyPath: 
dictionaryWithValuesForKeys: //输入一组key,返回这组key的所有值;
setValue:forKey:
setValue:forKeyPath: 
setValuesForKeysWithDictionary: //输入一个key-value的dictionary,调用setValue:forKey:进行一个一个的设置操作;

KVO

基本概念

KVO = "Key-Value Observing"
它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

使用方法

  1. 注册,指定被观察者的属性,
  2. 实现回调方法
  3. 移除观察

NSNotificationCenter

应用场景

  • 窗口变化通知
  • 系统键盘的出现和消失/位置大小变化
  • UITextField 字符变化通知(可以用来限制输入长度)
  • MPMoviePlayerController 播放器的行为变化
  • 自定义 Class 使用
Top