前言
很高兴遇见你~
众所周知,RxJava 是一个非常流行的第三方开源库,它能将复杂的逻辑简单化,提高我们的开发效率,一个这么好用的库,来让我们来学习一下吧:beer:
下面我抛出一些问题,如果你都知道,那么恭喜你,你对 RxJava 掌握的很透彻,如果你对下面这些问题有一些疑惑,那么你就可以接着往下看,我会由浅入深的给你讲解 RxJava,看完之后,这些问题你会非常明了
1、什么是观察者模式?什么是装饰者模式?
2、观察者模式,装饰者模式在 RxJava 中的应用?
3、RxJava map 和 flatMap 操作符有啥区别?
4、如果有多个 subscribeOn ,会是一种什么情况?为啥?
5、如果有多个 observeOn ,会是一种什么情况?为啥?
6、RxJava 框架流思想设计?
7、RxJava 的 Subject 是什么?
8、如何通过 RxJava 实现一个自己的事件总线?
一、设计模式介绍
我们先了解一下下面两种设计模式:
1、观察者模式
2、装饰者模式
1.1、观察者模式
1.1.1、观察者模式定义
简单的理解:对象间存在一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新
1.1.2、观察者模式示例
//1、定义一个观察者的接口 interface Observer { /** * 接收事件的方法 */ fun onChange(o: Any) } //2、定义一个被观察者的接口 interface Observable { /** * 添加观察者 */ fun addObserver(observer: Observer) /** * 移除观察者 */ fun removeObserver(observer: Observer) /** * 发送事件通知 */ fun changeEvent(o: Any) } //3、定义一个观察者的实现类 class ObserverImpl: Observer { override fun onChange(o: Any) { //对事件进行打印 println(o) } } //4、定义一个被观察者的实现类 class ObservableImpl: Observable { //存放观察者的集合 private val observerList: MutableList<Observer> = LinkedList() override fun addObserver(observer: Observer) { observerList.add(observer) } override fun removeObserver(observer: Observer) { observerList.remove(observer) } override fun changeEvent(o: Any) { for (observer in observerList) { observer.onChange(o) } } } //5、测试 fun main(){ //1、创建被观察者 val observable = ObservableImpl() //2、创建观察者 val observer1 = ObserverImpl() val observer2 = ObserverImpl() val observer3 = ObserverImpl() //3、添加观察者 observable.addObserver(observer1) observable.addObserver(observer2) observable.addObserver(observer3) //4、发送事件 observable.changeEvent("erdai666") } //打印结果 erdai666 erdai666 erdai666 复制代码
1.2、装饰者模式
1.2.1、装饰者模式定义
简单的理解:动态的给一个类进行功能增强
1.2.2、装饰者模式示例
举个例子:我想吃个蛋炒饭,但是单独一个蛋炒饭我觉得不好吃,我想在上面加火腿,加牛肉。我们使用装饰者模式来实现它
//1、定义一个炒饭的接口 interface Rice { fun cook() } //2、定义一个炒饭接口的实现类:蛋炒饭 class EggFriedRice: Rice { override fun cook() { println("蛋炒饭") } } //3、定义一个炒饭的抽象装饰类 abstract class RiceDecorate(var rice: Rice): Rice //4、往蛋炒饭中加火腿 class HamFriedRiceDecorate(rice: Rice): RiceDecorate(rice) { override fun cook() { rice.cook() println("加火腿") } } //5、往蛋炒饭中加牛肉 class BeefFriedRiceDecorate(rice: Rice): RiceDecorate(rice) { override fun cook() { rice.cook() println("加牛肉") } } //6、测试 fun main(){ //蛋炒饭 val rice = EggFriedRice() //加火腿 val hamFriedRiceDecorate = HamFriedRiceDecorate(rice) //加牛肉 val beefFriedRiceDecorate = BeefFriedRiceDecorate(hamFriedRiceDecorate) beefFriedRiceDecorate.cook() } //打印结果 蛋炒饭 加火腿 加牛肉 复制代码
装饰者模式的核心:定义一个抽象的装饰类继承顶级接口,然后持有这个顶级接口的引用,接下来就可以进行无限套娃了:smile:
二、手撸 RxJava 核心源码实现
ok,了解了两种设计模式,接下来我们正式进入 RxJava 的学习
2.1、RxJava 介绍
RxJava 是一个异步操作框架,其核心可以归纳为两点:1、异步事件流 2、响应式编程。接下来我们可以好好的去感受这两点
2.2、RxJava 操作符
RxJava 之所以强大源于它各种强大的操作符,掌握好这些操作符能让你对 RxJava 的使用得心应手,RxJava 操作符主要分为 6 大类:
每一个操作符背后都对应了一个具体的实现类,接下来我们就挑几个最常用,最核心的操作符:create,map,flatMap,observeOn,subscribeOn 进行手撸实现,相信看完这些操作符的实现后,你能融会贯通,举一反三
注意:下面这些操作符的实现和 RxJava 实现细节不尽相同,但核心思想是一致的,大家只要理解核心思想就好
2.3、create 操作符实现
create 是来创建一个被观察者对象,看了 RxJava create 操作符源码你会发现:
1、create 是使用观察者模式实现的,但 RxJava 里面使用的观察者模式和我们上面介绍的还有点不一样,它是一种变种的观察者模式
2、上面例子中我们是通过被观察者去发送事件,而 RxJava 里面定义了专门发送事件的接口,这样做的好处就是让被观察者和发射事件进行解耦
//1、定义一个观察者的顶级接口 interface Observer<T> { //建立了订阅关系 fun onSubscribe() //接收到正常事件 fun onNext(t: T) //接收到 error 事件 fun onError(e: Throwable) //接收到 onComplete 事件 fun onComplete() } //2、定义一个被观察者的顶级接口 interface ObservableSource<T> { //订阅观察者 fun subscribe(observer: Observer<T>) } //3、定义一个被观察者抽象类实现顶层被观察者接口 abstract class Observable<T>: ObservableSource<T> { override fun subscribe(observer: Observer<T>) { subscribeActual(observer) } //实际订阅观察者的抽象方法,让子类去实现 protected abstract fun subscribeActual(observer: Observer<T>) //伴生类里面的方法,直接通过类名调用 companion object{ //这里是我们实现 create 操作符对外提供和 RxJava 类似的方法调用 fun <T> create(source: ObservableOnSubscribe<T>): ObservableCreate<T>{ return ObservableCreate(source) } } } //4、定义一个与被观察者发射事件解耦的接口 interface ObservableOnSubscribe<T> { //通过 Emitter 发射事件 fun subscribe(emitter: Emitter<T>) } //5、定义事件发射器接口 interface Emitter<T> { //发送 onNext 事件 fun onNext(t: T) //发送 onError 事件 fun onError(e: Throwable) //发送 onComplete 事件 fun onComplete() } //6、定义 create 操作符的实现类 class ObservableCreate<T>(var source: ObservableOnSubscribe<T>): Observable<T>() { //实现父类订阅观察者的方法 override fun subscribeActual(downStream: Observer<T>) { //可以看到只要一订阅,首先就会接收 onSubscribe 事件 downStream.onSubscribe() //通过 ObservableOnSubscribe 里面的 Emitter 进行事件的发送,完成被观察者发送事件的解耦 source.subscribe(CreateEmitter(downStream)) } //事件发射器实现类,可以看到传入了下游的观察者来接收我们发射的事件 class CreateEmitter<T>(var downStream: Observer<T>): Emitter<T>{ override fun onNext(t: T) { downStream.onNext(t) } override fun onError(e: Throwable) { downStream.onError(e) } override fun onComplete() { downStream.onComplete() } } } //7、测试 fun main(){ Observable.create(object : ObservableOnSubscribe<String>{ override fun subscribe(emitter: Emitter<String>) { //发射 onNext 事件 emitter.onNext("erdai666") //发射 onComplete 事件 emitter.onComplete() } }).subscribe(object : Observer<String>{ override fun onSubscribe() { println("onSubscribe") } override fun onNext(t: String) { println("onNext:$t") } override fun onError(e: Throwable) { } override fun onComplete() { println("onComplete") } }) } //打印结果 onSubscribe onNext:erdai666 onComplete 复制代码
ok,上述代码就是 create 操作符的实现,大家如果没看明白可以多看几遍,也可以直接把我上面的代码直接拷贝到一个 kt 文件中去运行
2.4、map 操作符实现
map 是一个转换操作符,它能把一种类型转为为另外一种类型,如:Int -> String。
它的主要实现:观察者模式 + 装饰者模式 + 泛型
//1、定义一个抽象装饰类,注意里面泛型的使用 abstract class AbstractObservableWithUpstream<T,U>(var source: ObservableSource<T>): Observable<U>() //2、定义一个类型转换的接口 interface Function<T,