在学习RxJava的时候,经常提到观察者与被观察者,这不就是JAVA的观察者模式的运用么?是的,但是跟传统意义的上观察者模式还不太一样,所以Rxjava实际上是一种扩展的观察者模式,所以有必要对这个扩展的观察者模式做进一步的了解。

最简单的观察者模式:

对于之前写的关于Rxjava的代码先回顾一下:

但是如果我们不要修改事件,就不需要在Observable和Subscriber【它是Observer的子类】中插入Operator,那么时间Rxjava的结构如下:

Observable--->Subscriber

这看起来很像设计模式的观察者模式,但是有个重要的区别之一在于在没有Subscriber之前,Observable不会产生事件。

普通的观察者模式:

对于普通的观察者模式这里不多说,简单概念它就是:观察者(Observer)需要在被观察者(Observable)变化的一顺间做出反应。而两者通过注册(Register)或者订阅(Subscrible)的方式进行绑定。如下图所示:

RxJava--扩展的观察者模式:

而Rxjava的观察者模式跟上面普通的观察者模式差不多,但是也有几点差别:

  • Observer与Observable是通过subscrible()来达成订阅关系。
  • Rxjava中的事件回调有三种:onNext()、onCompleted()、onError()。
  • 如果一个Observable没有任何的Observer,那么这个Observable是不会发出任何事件的。

其中关于第三点,需要说明一下,在Rxjava中其实Observable有两种形式:热启动Observable和冷启动Observable:

  • 热启动Observable任何时候都会发送消息,即使没有任何观察者监听它。【它没有什么实际意义,所以说了解下既可】
  • 冷启动Observable只有在至少有一个订阅者的时候才会发送消息。【所以工作中使用的都是冷启动】

RxJava的观察者模式:

相比普通观察者模式,RxJava的观察者模式如下图:


当一个事件触发时,会有一些方法回调,如下:

  • onNext():基本事件。
  • onCompleted()事件队列完结。RxJava不仅把每个事件单独处理,还会把它们看作一个队列,RxJava规定,当不会再有新的onNext()事件发出时,需要触发onCompleted()方法作为标志。
  • onError()事件队列异常,在事件过程中出现异常时,onError()会被触发,同时队列自动终止,不允许再有事件发出。

RxJava的实现和使用【之前开篇已经有介绍过,这里再细致回顾下】:

RxJava的实现主要有如下三步:

第一步:创建观察者Observer。

Observer 即观察者,它决定事件触发的时候将有怎样的行为。注意:Observer是 个接口。 

第二步:创建被观察者Observable。

第三步:Subscribe(订阅)(被观察者Observable订阅观察者Observer,注意:不同于普通观察者,这里是被观察者订阅观察者)。

创建 Observable 和 Observer 之后,再 subscribe() 法将它们联结起来,整条链子就可以 作 。代码形式很简单: 

所以贴出之前实现过的代码:

编译运行:

这时制造一个异常再看下输出:

编译运行:

从打印中可以看出,onError()和onCompleted()是不共戴天滴。

除 Observer 接口之外,RxJava 还内置了一个实现 Observer 的抽象类:Subscriber(发 [səb'skraɪbɚ])。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

编译运行:

那既然观察者有两个:Observer和Subscriber,那这两者有啥区别呢?当然是有区别滴,不过在未来会进行学习,这里先有个印象。

另外在Rxjava中,如果对于事件回调中,只想要onNext()方法,onError()和onCompleted()都不需要,有木有简化方案呢?当然有:

而之前我们创建Observable是通过它:

所以简化版采用just操作符来,如下:

编译运行:

下面改用Action1类来达到我们所要的需求:

编译运行:

但是!!!官方并不推荐使用该类来简化操作,因为Action1并不支持背压(BackPressure),而产生的大至原因是由于Rxjava的事件产生过快时导致,这个后面会再学习,也先有个了解既可。

RxJava——扩展的观察者模式的更多相关文章

  1. GitHub上最受欢迎的 5 大 Java 项目

    1. Mockito Mockito 并不是无酒精混合饮料的意思.Mockito 是一个针对 Java 的 mocking 框架.它与 EasyMock 和jMock 很相似,但是通过在执行后校验什么 ...

  2. 78. Android之 RxJava 详解

    转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...

  3. RxJava学习入门

    RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...

  4. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  5. RxJava_ _学了下RxJava

    之前就知道有RxJava这玩意,知道这玩意很屌,不过也就止于看看标题,看几段介绍的程度(懒癌害人不浅).这周心血来潮,抽空把之前收藏的 扔物线 大神写的RxJava入门文章看了. http://gan ...

  6. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  7. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

  8. RxJava的使用

    前言 RxJava及RxAndroid比较详细的介绍可以参考该文档<给 Android 开发者的 RxJava 详解> 基本介绍 ReactiveX 及 RxJava使用大部分来自和参考& ...

  9. RxJava 教程-1 简介 原理 线程控制 变换

    简介 RxJava 是什么? RxJava 在 GitHub 主页上的自我介绍是 RxJava is a Java VM implementation of ReactiveX: a library ...

随机推荐

  1. kibana配置文件说明书

    #端口号 server.port: 5601 #kibana服务安装的地址 server.host: "192.168.122.21" #当使用代理时,这里可能对应的是加工后的ki ...

  2. python之pandas学习笔记-初识pandas

    初识pandas python最擅长的就是数据处理,而pandas则是python用于数据分析的最常用工具之一,所以学python一定要学pandas库的使用. pandas为python提供了高性能 ...

  3. input输入框内容变化实时监听

    js实现的文本框内容发生改变立马触发事件简单介绍:本章节介绍一下如何在文本框的内容发生变化的时候,立马触发一个事件执行响应的操作,而不是像是keydown或者keyup事件一样,只能够检测通过键盘输入 ...

  4. LoadRunner编程之文件的操作

    这篇文章主要写下LoadRunner下如何进行文件的操作. 1,文件的声明 LoadRunner不支持FILE数据类型,所以在LoadRunner中用int来声明一个文件: int MyFile; 2 ...

  5. Redis 学习笔记(篇八):事件

    Redis 服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件: Redis 服务器通过套接字与客户端(或者其他 Redis 服务器)进行连接,而文件事件就是服务器对套接字操作的抽象.服 ...

  6. springboot中配置文件使用2

    本文章接上一篇文章:https://www.cnblogs.com/ysq0908/p/11140931.html 1.使用注解@Value获取配置文件的值 注意:上述中的复杂数据封装指:有map等数 ...

  7. APM之原理篇

    APM,应用性能监控,有new relic等产品,对APM感兴趣的应该不会不知道它了.主要功能就是统计分析应用的CPU.内存.网络.数据库.UI等性能,并提供错误日志捕获.编码人员需要做的仅仅是使用它 ...

  8. 数据结构:BF算法

    贴上源代码: #include<iostream> using namespace std; int BF(char S[],char T[]) { int i,j; i = j = 0; ...

  9. 测试工作小工具~总结&下载连接

    1.Gif录制小工具(动图提单 ≖ᴗ≖) 地址:https://licecap.en.softonic.com/download

  10. 系统学习机器学习之神经网络(三)--GA神经网络与小波神经网络WNN

    系统学习机器学习之神经网络(三)--GA神经网络与小波神经网络WNN 2017年01月09日 09:45:26 Eason.wxd 阅读数 14135更多 分类专栏: 机器学习   1 遗传算法1.1 ...