在介绍 Observable 之前,我们要先了解两个设计模式:

  • Observer Pattern - (观察者模式)
  • Iterator Pattern - (迭代器模式)

这两个模式是 Observable 的基础,下面我们先来介绍一下 Observer Pattern。

一、什么是观察者模式?

一个简单的例子:
毕业前,很多同学都会说类似于这样的话:
“老王,等你结婚了,记得叫我来喝喜酒!”
于是有一天你真的要结婚了,且需要举办酒席,这时候你需要通知你的你的那些老友来喝喜酒。于是你拿起了手机给你的那些分布于世界各地的好朋友打起了电话,说了结婚酒席一事。
到了酒席那天,有的朋友来了,有的人没来礼却到了,有的呢只有简短的两句祝福,剩下的只有推脱。
————这就是观察者模式
观察者模式 - 图1

二、剖析模式

在观察者模式中,目标与观察者相互独立,又相互联系:

  • 两者都是相互独立的对对象个体。
  • 观察者在目标对象中订阅事件,目标广播发布事件。

就像之前的例子一样:

  • 老王就是模式中所谓的目标。
  • 同学们在毕业前说的话就相当于在目标对象上订阅事件。
  • 老王打电话通知朋友就是发布事件。
  • 同学们各自作出了不同的行动回应。

观察者模式 - 图2
从上面我们可以看到,这里面包含了两大类(主题和观察者)一共四个角色:
(1)Subject:抽象主题,他把所有观察者对象保存在一个集合里,可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。意思就是明星把所有的粉丝都保存在一个账号里面,粉丝数量不限,可以新增粉丝也可以拉黑粉丝。
(2)ConcreteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。意思是我们的明星一有动态,就会把消息给粉丝。
(3)Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。这就是我们所有粉丝的抽象。
(4)ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。具体每一个粉丝。

三、代码实现观察者模式

第一步:定义抽象观察者(Observer):抽象的粉丝
观察者模式 - 图3
第二步:具体的观察者(concreteObserver):具体的粉丝

观察者模式 - 图4
第三步:定义抽象主题(Subject):抽象明星

观察者模式 - 图5
第四步:具体主题(ConcreteSubject):具体的明星

观察者模式 - 图6
第五步:测试

观察者模式 - 图7

四、分析观察者模式

观察者模式的主要优点在于可以实现表示层和数据逻辑层的分离,并在观察目标和观察者之间建立一个抽象的耦合,支持广播通信;其主要缺点在于如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间,而且如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
其实还有一点需要我们去了解,在上面的例子当中我们的会发现,其实粉丝的消息是明星推过来的,还有一种观察者模式,也就是我们的粉丝主动去获取消息。
(1)推模型: 主题对象向观察者推送主题的详细信息,不管是否需要。
(2)拉模型:主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取。
OK。观察者模式就先到这,如有问题还请批评指正