5.从架构设计角度分析AAC源码-Rxjava2源码解析第0篇:Rxjava2开篇大纲

前言

如果对RxJava2一点都不了解建议先去使用,再来(或者去)看Rxjava源码解析,否则云里雾里的很难理解Rxjava2。

这篇文章主要提供和Rxjava2源码相关的概念性知识。总体对Rxjava2源码讲解分为以下几个部分:

  1. 第0篇,Rxjava2涉及的概念性知识;

  2. 第一篇,Rxjava2观察者模式去理解源码;

  3. 第二篇,Rxjava2-异步:线程切换和线程池分析;

  4. 第三篇,Rxjava2流stream-背压和操作符;

以上从第一篇开始都是从架构设计层面去理解Rxjava2源码。

概念

什么是Rx

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();
        
    }
}

5.从架构设计角度分析AAC源码-Rxjava2源码解析第0篇:Rxjava2开篇大纲_第1张图片

参考文献

  1. Rxjava2(一)、基础概念及使用

  2. Rxjava2(二)、五种观察者模式创建及背压

  3. rxjava系列理解

  • 主要三篇文章感觉有点用处:rxjava2源码解析(一)基本流程分析、rxjava2源码解析(二)线程切换分析、rxjava2源码解析(三)observeOn线程池原理分析;
  1. Java设计模式之装饰器模式.

总结

观察者模式和装饰器模式好像没有太明确的界限。可以从这两个角度去理解Rxjava2源码,或者说通过Rxjava2源码反过来可以推导出这两个设计模式。

好像也没啥要交代的,不废话直接开车!!!

你可能感兴趣的:(jetpack源码解析,rxjava,android)