深入观察者与被观察者模式
下面以一个经典的例子进行讲解:
1 | //创建一个被观察者(开关) |
针对上面的代码提出两个问题:
- 被观察者中的Observable.OnSubscribe是什么,有什么用?
- call(subscriber)方法中,subscriber哪里来的?
- 为什么只有在订阅之后,被观察者才会开始发送消息?
Observable 类深入
首先看一下OnSubscribe是什么?
1 | //前面也提到Acton1这个接口,内部只有一个待实现call()方法 |
前面也提到Acton1
这个接口,内部只有一个待实现call()
方法.OnSubscribe
接口继承了这个 Action1
接口,但是自己并没有增加新的方法;只是把泛型限定在了 Subscriber
,也就是说必须传入观察者对象;
那么也就是说,OnSubscribe
本质上也是和 Action1
一样的接口,只不过它专门用于Observable
内部。
那么将 OnSubscribe
接口传入 Observable
后,该接口干什么?
答:用来触发事件的发生,在call()
内部调用观察者的 onNext()
方法!!!
要注意的是在 Observable
被观察者的类中,OnSubscribe
是它唯一的属性,
同时也是Observable
构造函数中唯一必须传入的参数,也就是说,只要创建了Observable
,那么内部也一定有一个 OnSubscribe
实体对象。
当然,Observable
是没有办法直接new的,我们只能通过create(),just()等等方法创建,这些方法背后去调用了new Observable(onSubscribe)
再来大体看一下 Observable
这个类的骨架:
1 | public class Observable<T> { |
Observer 类深入
Observer是一个接口,其内部有三个方法:
- void onCompleted():处理被观察者发送完事件后的逻辑
- void onError(Throwable e):处理出错逻辑
- void onNext(T t):处理事件,有一个事件就执行一次
顺便说一下 Subscriber,其实 Observer的实现类,但也是抽象的,主要是也实现了Subscription接口,所以相对于 Observer接口添加了一些新的方法,也有一些除了这两个接口之外自定义的方法,都自己实现了
1 | abstract class Subscriber<T> implements Observer<T>, Subscription |
看一下其中的主要方法:
Observer中的方法:(Observer中的方法在Subscriber中均未实现,需要开发者自己实现,只有这个三个Subscriber没有实现)
- void onCompleted():处理被观察者发送完事件后的逻辑
- void onError(Throwable e):处理出错逻辑
- void onNext(T t):处理事件,有一个事件就执行一次
Subscription中的方法:
- void unsubscribe():取消订阅,停止接受被观察者发来的消息;
- boolean isUnsubscribed():是否取消了订阅被观察者发的消息;
Subscriber自身的方法:
void add(Subscription s):添加一个订阅对象
void onStart():是一个空实现,开发者可以自己实现该方法,该方法被调用的时机是在被观察者与观察者产生订阅,但是此时被观察者还为发出任何消息
subscribe(subscriber)方法深入
当创建了 Observable 和 Observer 之后,调用subscribe(subscriber)方法产生订阅关系时,发生了什么呢?
1 | //给被观察者传入了观察者对象 |
代码看到这里,我们就可以对上面三个问题做统一的回答了:
- onSubscribe是Observable内部唯一属性,是连接Observable和subscriber的关键,相当于连接台灯和开关的那根电线,主要是其内部的call()方法,在该方法中发送了消息;
- call(Subscriber<? super String> subscriber)中的subscriber,就是我们自己创建的那个观察者
- 只有在订阅的时候,才会发生onSubscribe.call(subscriber),进而才会开始调用onNext(),onComplete()等。