rxjava源码沿用了什么设计模式?
它是怎么生成订阅关系的?
rxjava源码沿用了什么设计模式?
装饰者模式
观察者模式
建造者模式
rxjava的生产链一共分为4个步骤(我把rxjava比喻成一把枪):
创建被观察者(上游)---弹夹上弹
创建观察者(下游) ---装枪膛
订阅关系 ---打开保险
发射数据 ---发射
如图所示:
开始阅读源码
上面提到,rxjava的生产链分别为3步,第一步为创建上游,代码如下:
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
......
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
我们看到,创建上游的时候,new了一个ObservableCreate对象,所需要的参数为ObservableOnSubscribe类型,继续追踪ObservableCreate看看初始化的时候,做了哪些操作:
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
......
}
我们看到 this.source = source。那么第一步装弹夹完成,记下来就是装枪膛:
@Override
public final void subscribe(Observer<? super T> observer) {
ObjectHelper.requireNonNull(observer, "observer is null");
try {
observer = RxJavaPlugins.onSubscribe(this, observer);
ObjectHelper.requireNonNull(observer, "The RxJavaPlugins.onSubscribe hook returned a null ...");
subscribeActual(observer);
} catch (NullPointerException e) {
throw e;
}
......
}
以上我们看到,subscribe的时候必须要传一个Observer对象进去,那么Observer其实就是枪膛。OK,枪膛安装完毕。
接下来,就是要拉枪栓上子弹了。我们看subscribeActual(observer)这一步其实就上拉栓上弹。何以见得?
我们都知道每一把枪都必须拉栓才能上弹,所以ak47也不例外,那么哪一步是拉栓上弹的代码呢?
它就是subscribeActual,他是实现订阅的关键步骤。
看以下代码:
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent);
try {
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
我们看到,在实现订阅的时候,创建了CreateEmitter,也就是ak47的扳机。众所周知,emitter是rxjava发送时间的主要方法。
它包含有以下执行发射的指令方法
onNext (子弹)
onError (哑弹)
onComplete (子弹打没了)
isDisposed (上保险)
我们看以上代码:
observer.onSubscribe(parent); 这句代码代表下游与emitter进行了订阅,也就是扳机与枪膛取得了联系
source.subscribe(parent); 这句就代表了上游与emitter已经订阅,已经扣动扳机突突突了。
那么这时候,枪膛(Observer)里就不断收到弹夹ObservableOnSubscribe传输过来的子弹(emitter.onNext)进行突!突!突!
这时候,敌人就凉了。rxjava的流程也跑完了。
那么rxjava沿用了哪些设计模式呢?
看到Observable的create方法调用其子类ObservableCreate,我们知道ObservableCreate其实就是它的拓展,通过subscribeActual进行装饰,所以rxjava沿用了装饰者模式
从上面的论证得知,rxjava是一个响应式编程,所以沿用了观察者模式
众所周知,rxjava可以链式调用,所以沿用了建造者模式
它是怎么生成订阅关系的?
subscribeActual