RX系列一 | ReactiveX根源 | 观察者模式分析
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根源 | 观察者模式分析的更多相关文章
- RX系列三 | RxJava | create | from | interval | just | range | filter
RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...
- Rx系列---响应式编程
Rx是ReactiveX的简称,翻译过来就是响应式编程 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同.相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一 ...
- RX系列四 | RxAndroid | 加载图片 | 提交表单
RX系列四 | RxAndroid | 加载图片 | 提交表单 说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较 ...
- Rx系列二 | Observer | Observable
Rx系列二 | Observer | Observable 上节课我们对RX的一些基本概念和使用JAVA代码实现了一个观察者,但是这只是对思路的一个讲解,在我们JAVA中,其实是已经封装好了观察者对象 ...
- 《Head First设计模式》批注系列(一)——观察者设计模式
最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...
- RxSwift 系列(九) -- 那些难以理解的概念
前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...
- RxSwift 系列(九)
前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...
- RxSwift 介绍
RxSwift 介绍 中文文档 https://beeth0ven.github.io/RxSwift-Chinese-Documentation/ https://medium.com/@DianQ ...
- RxJava && Agera 从源码简要分析基本调用流程(2)
版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qclo ...
随机推荐
- POJ-1860 Currency Exchange---Bellman-Ford判断正环
题目链接: https://vjudge.net/problem/POJ-1860 题目大意: 我们的城市有几个货币兑换点.让我们假设每一个点都只能兑换专门的两种货币.可以有几个点,专门从事相同货币兑 ...
- Django REST framework+Vue 打造生鲜超市(五)
六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...
- 那些年,曾踩过的Spark坑
1.报错18/01/25 14:56:58 ERROR executor.CoarseGrainedExecutorBackend: Driver 127.0.0.1:37159 disassocia ...
- 【省带宽、压成本专题】从产品架构来看,PCDN如何节流50%
过去几年,我们一直在视频省流量方面潜心钻研,取得不俗的成果.本次"省带宽.压成本"系列一共会推出六篇文章,从技术迭代.硬件更新等角度出发,向大家介绍节省CDN流量,降低视频播放成本 ...
- 创建类似于Oracle中SYS_GUID() 的方法
CREATE or REPLACE FUNCTION "sys_guid"()RETURNS "pg_catalog"."varchar" ...
- selenium 设置代理的话,可以使用这种方式,代码是我刚才测试过的,亲测可用
from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argumen ...
- 机器学习基石:06 Theory of Generalization
若H的断点为k,即k个数据点不能被H给shatter,那么k+1个数据点也不能被H给shatter,即k+1也是H的断点. 如果给定的样本数N是大于等于k的,易得mH(N)<2N,且随着N的增大 ...
- Python3玩转儿 机器学习(2)
机器学习的基本任务 分类任务 回归任务 分类任务 手写输入数字识别 分类任务: 二分类任务 判断邮件是垃圾邮件或者不是垃圾邮件 判断发放给客户信用卡有风险或者没有风险 判断病患良性肿瘤还是恶性肿瘤 判 ...
- [NOI 2005]聪聪和可可
Description 题库链接 一只猫和一只老鼠在一张 \(n\) 个节点和 \(m\) 条边的无向图上,初始位置不同.对于每一时刻,猫会先走,它走的方向为靠近老鼠的方向:若多个节点可选,则选字典序 ...
- [SCOI2016]背单词
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...