美文网首页
iOS设计模式-观察者模式

iOS设计模式-观察者模式

作者: 渡口丶 | 来源:发表于2019-10-28 18:32 被阅读0次

    一、定义

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

    二、使用场景

    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设计模式-观察者模式

          本文链接:https://www.haomeiwen.com/subject/qbwsvctx.html