RX系列一 | ReactiveX根源 | 观察者模式分析


Rx的响应式编程算是很火了,对吧,但是我的工作基本上就不会接触,所以学习的比较晚,到现在才分享给大家,我们一点点的去学,当你看完这整个系列的博客的时候,我相信你最起码也是能把Rx的操作放入你的项目中,既然如此,那我们就开始吧!

一.资料

现在的资料都烂大街了,我也是看这些资料学的,先分享出来

当然还有其他更多的优秀资源,这里就不一一罗列了

二.Rx介绍

ReactiveX这种思想可以理解为编程模型,全称是Reactive Extensions,微软在2012年11月开源的编程模型,其目的就是提供一致的编程接口,帮助开发者更方便的处理异步数据流,所以目前支持的还是比较多的,像RxJava/RxAndroid/RxJs等,说实话,ReactiveX可以说是一种编程思想的突破,他对我们的影响很大,很多人说Rx难用,但是你用习惯了,你就爱不释手了,就像Android Studio一样,刚开始是很多人用不习惯,后来就离不开他了。

三.Rx模式

说他的模式,很多人肯定知道了,那就是观察者模式啊,我就死死的盯着你

  • 创建:创建事件流和数据流

  • 组合:链式操作,Rx使用的查询式的操作符和变换数据流

  • 监听:Rx可以订阅任何可以被操作的数据流并且执行操作

他的模型也对应的他的操作符,我列举一些

  • 过滤filter

  • 选择select

  • 变换transform

  • 结合combine

  • 组合compose

四.优点

优点可以概括为:代码写的少,逻辑理得好

  • 函数编程风格,可以很好的理清逻辑

  • 操作符:几行代码就可以处理复杂操作

  • 异步错误处理:异常有迹可循,归纳到位

  • 代码优化,处理同步,并发都是优点

五.RxJava的观察者模式

观察者模式面向的需求是:A对象(观察者)对B对象(被观察者)的某种高度变化敏感,需要在B变化的一瞬间做出反应,这点很类似警察抓小偷,警察一直在观察着小偷,当小偷开始偷东西的时候一下把他抓住

我们本篇会将Android中RxAndroid的运用,在此之前,你要理解一下RxJava,放心,这对你来说并不是什么难事

六.RxJava的概念

RxJava的四个基本概念

  • Observable(被观察者)

  • Observer(观察者)

  • subscribe(订阅)

  • 事件

由这四个概念就组成了最基本的观察者了,Observable和Observer通过subscribe订阅,从而让Observable需要的时候发出事件通知Observer

七.JAVA事件监听

我们可用先模拟一下我们之前的事件监听是怎么样的,其实就是模拟一下警察抓小偷,逻辑很简单,我写个小偷,写几个警察,当小偷偷东西的时候警察就抓他,那好,那我们怎么做?仔细看代码

1.被观察者

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.java
 *文件名:  Watched
 *创建者:  LGL
 *创建时间:2016/12/1112:57
 *描述:    被观察者
 */
public interface Watched {
    //添加观察者
    public void addWatcher(Watcher watcher);
    //取消观察者
    public void removeWatcher(Watcher watcher);
    //通知
    public void notifyWatcher(String string);
}

2.观察者

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.java
 *文件名:  Watcher
 *创建者:  LGL
 *创建时间:2016/12/1112:55
 *描述:    观察者
 */

public interface Watcher {
    //更改通知
    public void update(String string);
}

这里就很好理解了,我们定义了两个接口,观察者和被观察者,观察者发送消息,被观察者添加/取消/通知观察者,那我们来看具体实现

3.被观察者实现

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.java
 *文件名:  ConcreteWatched
 *创建者:  LGL
 *创建时间:2016/12/11 13:00
 *描述:    被观察者
 */
public class ConcreteWatched implements Watched{

    private List<Watcher>mList = new ArrayList<>();
    @Override
    public void addWatcher(Watcher watcher) {
        mList.add(watcher);
    }
    @Override
    public void removeWatcher(Watcher watcher) {
        mList.remove(watcher);
    }
    @Override
    public void notifyWatcher(String string) {
        for(Watcher watcher:mList){
            watcher.update(string);
        }
    }
}

4.观察者实现

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.java
 *文件名:  ConcreteWatcher
 *创建者:  LGL
 *创建时间:2016/12/1113:18
 *描述:    观察者
 */
public class ConcreteWatcher implements Watcher{
    @Override
    public void update(String string) {
        System.out.print(string);
    }
}

这里,我们的具体实现,只是对数据做了一些处理,我们通过addWatcher添加观察者,当被观察者达到某种条件的时候,我们就通知观察者打印出来,这样就是一整套的逻辑了,好,那我们再来编写一个测试的类,看看实际的效果如何

5.Test

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.java
 *文件名:  Test
 *创建者:  LGL
 *创建时间:2016/12/1113:02
 *描述:    测试类
 */
public class Test {
    public static void main(String [] args) throws Exception{
        Watched  thief = new ConcreteWatched();

        Watcher police1  = new ConcreteWatcher();
        Watcher police2  = new ConcreteWatcher();
        Watcher police3  = new ConcreteWatcher();

        //订阅
        thief.addWatcher(police1);
        thief.addWatcher(police2);
        thief.addWatcher(police3);

        thief.notifyWatcher("Steal things \n");
    }
}

这里我实现了一个被观察者,又实现了三个观察者,当被观察者开始Steal things的时候,观察者就会打印,那我们Run main一下看看是否真的打印出来了

写这个例子只是让大家明白一下,这个观察者模式的概念,这对我们学习Rx的思想模型有很大的帮助,大家可以继续回味一下,或者下载Sample去查看一下

Sample下载:系列最后一篇提供

本篇作为第一篇,还是一点点的把思路带进去吧,看下这样的效果好不好,并且我的博客排版更换了一下风格,这样的样式大家喜欢吗?

别说了,加群吧:555974449

RX系列一 | ReactiveX根源 | 观察者模式分析的更多相关文章

  1. RX系列三 | RxJava | create | from | interval | just | range | filter

    RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...

  2. Rx系列---响应式编程

    Rx是ReactiveX的简称,翻译过来就是响应式编程 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同.相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一 ...

  3. RX系列四 | RxAndroid | 加载图片 | 提交表单

    RX系列四 | RxAndroid | 加载图片 | 提交表单 说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较 ...

  4. Rx系列二 | Observer | Observable

    Rx系列二 | Observer | Observable 上节课我们对RX的一些基本概念和使用JAVA代码实现了一个观察者,但是这只是对思路的一个讲解,在我们JAVA中,其实是已经封装好了观察者对象 ...

  5. 《Head First设计模式》批注系列(一)——观察者设计模式

    最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...

  6. RxSwift 系列(九) -- 那些难以理解的概念

    前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...

  7. RxSwift 系列(九)

    前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...

  8. RxSwift 介绍

    RxSwift 介绍 中文文档 https://beeth0ven.github.io/RxSwift-Chinese-Documentation/ https://medium.com/@DianQ ...

  9. RxJava && Agera 从源码简要分析基本调用流程(2)

    版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qclo ...

随机推荐

  1. golang如何使用channel控制goroutine退出

    最经典的处理方式: 在启动goroutine的时候,传递一个额外的chan型参数,用来接收退出信号,代码如下 func worker(name string, stopchan chan struct ...

  2. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  3. 在容器中运行 Jenkins pipeline 任务

    持续集成中的 pipeline 技术和 docker 都是当前正在发展的主流方向,当然把它们结合起来在 CI/CD 过程中发挥出更强大的威力也是大家共同的目标.本文将介绍如何在 Jenkins pip ...

  4. 使用IntelliJ IDEA的小技巧快乐编程(1)

    前言 我很喜欢和别人讨论一些问题,有时候,在公司里,讨论这样的问题需要演示代码.常常会碰到的一种情况是(根据我的记忆这半年多来至少超过了10次),别人会打断你的演示,抛出一个问题:等等,你刚才的操作是 ...

  5. python 随笔

    python 学习笔记 运算符重载 PYTHON-进阶-魔术方法小结(方法运算符重载) python有着像C++相似的运算符重载,只需要在类中重写__add__.sub 等方法,就可以直接对对象进行 ...

  6. 基于webpack的React项目搭建(一)

    前言 工欲善其事,必先利其器.为了更好的学习React,我们先简要的把开发环境搭建起来.本文主要介绍使用webpack搭建React项目,如果你对React或es6的基础语法还不了解,建议先去学习学习 ...

  7. [HNOI 2014]画框

    Description 题库链接 \(T\) 组询问,每组询问给你个 \(2\times N\) 的带权二分图,两个权值 \(a,b\) ,让你做匹配使得 \[\sum a\times \sum b\ ...

  8. [HNOI 2009]最小圈

    Description 考虑带权的有向图$G=(V,E)$以及$w:E\rightarrow R$,每条边$e=(i,j)(i\neq j,i\in V,j\in V)$的权值定义为$w_{i,j}$ ...

  9. [ZJOI2015]幻想乡战略游戏

    Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...

  10. ●洛谷P1083 借教室

    题链: https://www.luogu.org/problemnew/show/P1083题解: 二分,差分 显然具有二分性: 如果只考虑1~p个人,就会在某一天无法满足, 那么显然只考虑1~[p ...