定义
观察者模式也叫做发布-订阅
模式,当一个对象状态发生改变,所以依赖于他的订阅者都会得到通知并自动
应用场景
关联场景
事件多级触发
这个可以暂时理解为响应式编程
跨系统消息交互场景
例如:消息队列 事件总线 RxSwift RxJava RxAndroid
观察者模式
KVO
,NSNotification
,委托Delegate
都可以说是OC
中的监听者模式,NSNotification
相当于更加重量级一些,除了监听还可以负责传递信息等
下面先很粗略的简单介绍下,毕竟之前有专门写过KVO
,NSNotification
-
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是一个只有协议申明的文件
我个人感觉有点像多太