设计模式-观察者模式

定义

观察者模式也叫做发布-订阅模式,当一个对象状态发生改变,所以依赖于他的订阅者都会得到通知并自动

应用场景

关联场景
事件多级触发

这个可以暂时理解为响应式编程

跨系统消息交互场景

例如:消息队列 事件总线 RxSwift RxJava RxAndroid

观察者模式

KVONSNotification委托Delegate都可以说是OC中的监听者模式,NSNotification相当于更加重量级一些,除了监听还可以负责传递信息等
下面先很粗略的简单介绍下,毕竟之前有专门写过KVONSNotification

  • KVO
    KVO是用来做属性监听的,用完后必须要移除它。

其实现原理:KVO是基于runtime机制实现的,当某个类的对象第一次被观察时,系统就会在运行期动态的创建一个该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法,派生类在重写基类的setter方法中实现真正的通知机制

上述,就是一个KVO的完整实现,但事实上,还是有瑕疵的,潜在的问题有可能出现在dealloc中对KVO的注销上。KVO的一种缺陷(其实不能称为缺陷,应该称为特性)是,当对同一个keypath进行两次removeObserver时会导致程序crash,这种情况常常出现在父类有一个kvo,父类在dealloc中remove了一次,子类又remove了一次的情况下

  • NSNotification
    一个类的属性发生改变,我们也可以使用NSNotification告诉其他对象,被改变的具体情况
    这样,也是可以监听到对象属性的改变的
    只是说,需要注意,如果是跨控制器之间的监听、或者传递信息,建议用NSNotification更好,如果是view与它的ViewController之间的监听,用委托(也就是delegate)更好

  • KVC
    KVC: key values coding 键值编码,间接通过字符串对应的key取出、修改其对应的属性。
    KVC当然是强大的,UIKit框架里面很多属性是readOnly、私有的,往往我们在开发中会觉得有一些属性不好用,想改变吧,要么是readOnly,要是是私有的,难道重新写一套?但是耗时耗力,项目需要赶进度的话,就得加班。这个时候,KVC的作用就大了,我们可以自定义那些特定需求的控件,然后用KVC将系统自带的换掉,换成自定义的,简单快速轻松就可以搞定了。当然,要是系统没有对应属性的控件,就只能自定义了,太多用处了
    作用: 可以访问和修改私有成员变量、readOnly成员变量的值。(替换系统自带的导航栏、替换系统自带的Tabbar等

  • 委托 + Delegate
    这个是我本身代码里经常用到的一种,一般是view与它的ViewController之间的监听,用委托(也就是delegate),因为我一般ui全写在view里,那么view里相关点击方法什么的,都是通过delegate代理到viewcontroller里的

  • 根据观察者模式设计的代码
    如上四个都是语言设计里自带里有关于观察者设计模式的内容,那么如果自己写一个观察者模式应该怎么做呢
    实现的基本原理

    image.png

    Subject通过内部数组observerArr保存观察者列表,通过addObserver和removeObserver添加、移除观察者,当Subject对象状态发生变化的时候,调用update方法,update方法遍历observerArr对象数组调用Observer的update方法通知观察者,Observer是一个只有协议申明的文件

我个人感觉有点像多太

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