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. jacascript 函数声明、函数表达式与声明提升(hoisting机制)

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 声明.定义.初始化 声明的意思是宣称一个变量名的存在,定义则为这个变量分配存储空间,初始化则是给该变量名的 ...

  2. jms - activeMQ入门案例

    activeMQ入门案例 叨叨一波,很久没写博客了,最近比较慢,时间抽不出来,这个借口说的很尴尬...我知道作为一名合格的码农就必须养成每天一博客的习惯.希望友友们别像我这样懒,闲话不多时进入今天的主 ...

  3. 【基础】在css中绘制三角形及相关应用

    简言 本文简要阐述了用CSS边框的方法在页面上绘制三角形,包括几种典型的三角形绘制,还介绍了几个简单的应用场景.利用边框绘制三角形方法只是众多方案中的一种,大家根据项目实际,选用最适宜项目的方案. 1 ...

  4. C# WinForm 富文本编辑器 用kindeditor实现本地图片只选取不上传到编辑器

    以下资料有参考网上其它童鞋作品,原作者看到务喷!!!! 以下资料有参考网上其它童鞋作品,原作者看到务喷!!!! 重要的事只要说两遍... 网上找了几天关于WinForm富文本编辑效果都不理想,各种坑, ...

  5. Java 内部类的意义及应用

    众所周知,我们的 C++ 程序语言是多继承制的,而多继承明显的好处就是,相对而言只需要写较少的代码即可完成一个类的定义,因为我们可以通过继承其它类来获取别人的实现. 但是,它也有一个致命性的缺陷,容易 ...

  6. 如何对url的的参数进行一个对象转化

    本例子是直接写在一个react组件中的 不过方法还是原生的方法 不多说 直接上代码 比如我们有一个 url: 'www.zhangfeng.com?id=1&name=zhangfeng&am ...

  7. 如何降低移动APP的开发成本

    在当下竞争激烈的商业世界中,移动APP开发是您业务的有利补充.移动APP可通过吸引新客户和保留现有客户,帮助公司成功开展业务.定制一个属于自己公司的移动APP扮演着重要角色,手机APP可以说通过轻松处 ...

  8. webpack的学习准备工作

    第一步:创建一个空项目,在terminal中 npm init  创建package.json文件,直接回车便可. 第二步:局部安装webpack: npm install --save-dev we ...

  9. 是否有必要学习使用纯Verilog写一个SDRAM控制器

    在做这个SDRAM控制器之前,博主有一个疑问,对于学生来说,是否有必要学习用纯Verilog写一个SDRAM控制器?因为目前X家和A家都有了DDR IP Core,对于要实现一个应用可以直接调用IP ...

  10. [CEOI2008]order

    Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 Solu ...