iOS设计模式-观察者模式

一、定义

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新。
观察者提供了一种对象设计,让主题和观察者之间松耦合。

二、使用场景

1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变。
3、当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,不希望这些对象是紧密耦合的

三、简单实现

Cocoa通过两种方式实现了这种设计模式:通知KVO(Key-Value Observing)

通知:一对多
  1. 添加订阅者

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething)  name:@"notificationName" object:nil];
    

2.发布者发布通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:nil];

3.移除订阅

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"notificationName" object:nil];

4.更新UI

- (void) doSomething {
    // TODO
}
KVO:一对一
  • 通过addObserver:forKeyPath:options:context:方法注册观察者,观察者可以接收keyPath属性的变化事件。
  • 在观察者中实现observeValueForKeyPath:ofObject:change:context:方法,当keyPath属性发生改变后,KVO会回调这个方法来通知观察者。
  • 当观察者不需要监听时,可以调用removeObserver:forKeyPath:方法将KVO移除。需要注意的是,调用removeObserver需要在观察者消失之前,否则会导致Crash

四、总结

观察者模式的主要的作用就是对对象解耦,将观察者和被观察者完全隔离。

  • 观察者模式的优点:
    观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。
  • 观察者模式的缺点
    程序中包括一个被观察者和多个被观察者,开发和调试比较复杂,容易造成客户端的内存泄漏。

你可能感兴趣的:(iOS设计模式-观察者模式)