如果对RxJava2一点都不了解建议先去使用,再来(或者去)看Rxjava源码解析,否则云里雾里的很难理解Rxjava2。
这篇文章主要提供和Rxjava2源码相关的概念性知识。总体对Rxjava2源码讲解分为以下几个部分:
第0篇,Rxjava2涉及的概念性知识;
第一篇,Rxjava2观察者模式去理解源码;
第二篇,Rxjava2-异步:线程切换和线程池分析;
第三篇,Rxjava2流stream-背压和操作符;
以上从第一篇开始都是从架构设计层面去理解Rxjava2源码。
ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,Rx是由由微软开发并开源的一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,Rx库支持很多语言,而 Rxjava 是Rx库基于Java语言提供的函数库。
观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新,观察者模式属于行为型模式。
###响应式(Reactive Programming)编程
一般来说,编程就是为了处理问题,解决问题就可以有不同的视角和思路,其中具有普适性的模式就会归结一种编程思想,我们常说的面向对象,面向过程都是一种编程思想。
响应式编程是一种通过异步和数据流来构建事务关系的编程模式
这里面包含的两个核心概念:
异步:不需要等待处理完成便立刻返回,通过回调将处理结果带回。能提高吞吐量,提高性能和效率。
数据流:就是按照时间线的事件序列,任何东西都可以看做是一个stream。在这个基础上通过函数来过滤(filter)、选择(select)、变换(transform)、结合(combine)这些stream。通过定义事件处理器,来异步捕获感兴趣的stream,即监听(订阅)stream,也叫就是注册观察者。
再对比我们前面的观察者模式看,观察者模式中被观察者和观察者之间通过订阅产生依赖,订阅这层关系相当于在二者之前挖了一道水渠,被观察者是上游,观察者是下游,这样被观察者发生改变时候,会将数据流源源不断的发送到产生依赖关系的观察者,通常观察者和被观察者是处于同一个线程中,但是响应式编程重点在异步上,即上游和下游可以在不同的线程中工作。
装饰器模式是指给一个类增强一些方法,对其做一些包装,但是不会影响改变原本类。
案例如下:
假设有一个炸鸡接口,定义了一个制作炸鸡的方法,麦当劳和肯德基和德克士对其的制作炸鸡方法做了重写,每个厂商肯定都有自己的实现。现在假设国家规定当制作完炸鸡需要对成品做一个检查。此时我们有2个解决方案,就是直接去每个厂家制作炸鸡的方法的最后一行加上检查的逻辑,这样太过于复杂,要不就是定义N个(看有多少个厂家)子类去继承原有厂家,然后重写制作炸鸡方法,先super调用父类的实现,再自己写检查的逻辑。这样也会特别的复杂,特多的冗余代码。
所以就可以定义一个炸鸡接口的装饰类,内部维护一个炸鸡类,然后也是重写制作炸鸡方法,然后装饰类用内部维护的被装饰炸鸡类,调用制作炸鸡方法,然后把增强的逻辑加在方法后面,就可以完美的避免N个子类。
代码实现:
创建一个炸鸡接口
/**
* @Author liha
* @Date 2022-03-27 19:20
* 李哈YYDS
*/
public interface FriedChicken {
void makeFriedChicken();
}
KFC的继承炸鸡接口,重写制作炸鸡方法
public class KFC implements FriedChicken{
@Override
public void makeFriedChicken() {
System.out.println("肯德基制作了一份炸鸡");
}
}
麦当劳的继承炸鸡接口,重写制作炸鸡方法
public class McDonald implements FriedChicken{
@Override
public void makeFriedChicken() {
System.out.println("麦当劳制作了一份炸鸡");
}
}
然后定义一个炸鸡接口的装饰器类,对制作炸鸡方法进行一个加强!
/**
* @Author liha
* @Date 2022-03-27 19:23
* 李哈YYDS
*/
public class FriedChickenDecorator implements FriedChicken{
// 内部维护一个炸鸡类
private FriedChicken friedChicken;
// 通过构造方法把需要装饰的炸鸡类传进来
public FriedChickenDecorator(FriedChicken friedChicken) {
this.friedChicken = friedChicken;
}
// 增强方法
@Override
public void makeFriedChicken() {
friedChicken.makeFriedChicken();
System.out.println("检查炸鸡是否存在问题");
}
}
测试类如下:
/**
* @Author liha
* @Date 2022-03-27 19:24
* 李哈YYDS
*/
public class Test {
public static void main(String[] args) {
FriedChicken kfc = new KFC();
System.out.println("没增强前:");
kfc.makeFriedChicken();
System.out.println("==================");
FriedChicken mcDonald = new McDonald();
System.out.println("没增强前:");
mcDonald.makeFriedChicken();
System.out.println("==================");
// 把需要增强的类通过构造方法传进去
FriedChicken kfcDecorator = new FriedChickenDecorator(kfc);
System.out.println("增强后:");
kfcDecorator.makeFriedChicken();
System.out.println("==================");
// 把需要增强的类通过构造方法传进去
FriedChicken mcDonaldDecorator = new FriedChickenDecorator(mcDonald);
System.out.println("增强后:");
mcDonaldDecorator.makeFriedChicken();
}
}
Rxjava2(一)、基础概念及使用
Rxjava2(二)、五种观察者模式创建及背压
rxjava系列理解
观察者模式和装饰器模式好像没有太明确的界限。可以从这两个角度去理解Rxjava2源码,或者说通过Rxjava2源码反过来可以推导出这两个设计模式。
好像也没啥要交代的,不废话直接开车!!!