Rxjava解析笔记 | Rxjava概述 & 传统观察者设计模式解析
时间:2022-06-23
本文章向大家介绍Rxjava解析笔记 | Rxjava概述 & 传统观察者设计模式解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
进行耗时任务
比如:在后台做一些网络操作、查询或者一些复杂计算的时候, 我们如果不用其他框架的话, 最常见做法即自己开一个子线程, 然后通过回调的形式获取到结果(如后台以结果为参数发送广播,前台回调onReceive()接收获取到结果); 但是这样有一个问题, 随着业务逻辑越来越复杂, 项目会陷入回调中套回调的病区, 这对后期维护代码来说是一个很严重的问题;
而Rxjava的出现解决了以上的问题
- Rxjava本质上是一个
异步操作库
; 它是一个能用非常简单的逻辑,去处理那些繁琐复杂任务 的 异步的操作事件库; Rxjava在一定的程度上, 也能替代项目中非常多的Handler、AsyncTask
等等;
关于Rxjava的设计模式——观察者模式
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新;
- 在app开发中,如果有一个对象的状态/数据,是你非常要关心的, 同时你每个页面所有的UI都会跟这个对象绑定, 即当这个对象发生改变的时候,我们就需要通知所有的页面都去做UI改变; 以上所述其实便是一种观察者模式; A对象对B对象的数据高度敏感, 当B对象变化的一瞬间,A对象要做出反应; 这时候A对象就是观察者,B对象就是被观察者; 观察者模式的情况, 就是众多的观察者,对被观察者的数据 高度敏感, 被观察者变化之后观察者自身的一种反应, 它是一种一对多的关系,多个观察者对应一个被观察者;
- 观察者模式的UML类图
简单看一下Observer的代码
- Observerable接口:
package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
- Observer接口:
package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public interface Observer {
public void update(int edition,float cost);
}
- ConcreteObserverable实现类:
package com.example.jiajiemu.a11.observe;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Mjj on 2017/10/6.
*/
public class ConcreteObserverable implements Observerable {
private List<Observer> mObservers;
private int edition;
private float cost;
public ConcreteObserverable() {
mObservers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
mObservers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = mObservers.indexOf(o);
if(i >= 0)
mObservers.remove(i);
}
@Override
public void notifyObservers() {
for(int i = 0; i < mObservers.size(); i++){
Observer observer = mObservers.get(i);
observer.update(edition, cost);
}
}
public void setInfomation(int edition,float cost){
this.edition = edition;
this.cost = cost;
//信息更新完毕,通知所有观察者
notifyObservers();
}
}
- .
-
notifyObservers()
: 可以看到方法中所写,遍历所有观察者, 依次使每一个观察者调用update()方法
进行数据更新 (update()方法
在ConcreteObserver中具体实现):
-
@Override
public void notifyObservers() {
for(int i = 0; i < mObservers.size(); i++){
Observer observer = mObservers.get(i);
observer.update(edition, cost);
}
}
- ConcreteObserver实现类:
package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public class ConcreateObserver implements Observer {
private String name;
private int edition;
private float cost;
public ConcreateObserver(String name){
this.name = name;
}
@Override
public void update(int edition, float cost) {
this.edition = edition;
this.cost = cost;
buy();
}
public void buy(){
System.out.println(name+"购买了第"+edition+"期的杂志,花费了"+cost+"元。");
}
}
- .
- 主要实现,
update()
方法中添加的业务逻辑buy()方法, buy()方法是可以根据不同场景做相应的逻辑判断,数据更新; 或者可以在update()方法中添加更多的业务逻辑
;
- 主要实现,
- Client客户端测试类:
package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public class Client {
public static void main(String[] args) {
//创建被观察者
ConcreteObserverable concreteObserverable = new ConcreteObserverable();
//创建三个不同的观察者
Observer observerA = new ConcreateObserver("A");
Observer observerB = new ConcreateObserver("B");
Observer observerC = new ConcreateObserver("C");
//将观察者注册到被观察者中
concreteObserverable.registerObserver(observerA);
concreteObserverable.registerObserver(observerB);
concreteObserverable.registerObserver(observerC);
//更新被观察者中的数据,当数据更新后,会自动通知所有已注册的观察者
concreteObserverable.setInfomation(5, 12);
}
}
- .
-
setInformation()
,封装了一下notifyObservers()
:
-
@Override
public void notifyObservers() {
for(int i = 0; i < mObservers.size(); i++){
Observer observer = mObservers.get(i);
observer.update(edition, cost);
}
}
public void setInfomation(int edition,float cost){
this.edition = edition;
this.cost = cost;
//信息更新完毕,通知所有观察者
notifyObservers();
}
传统观察者模式的使用场景
1.一个方面的操作/处理
依赖于另一个方面的状态变化
;
(即观察者的操作依赖于被观察者的状态变化;
埋伏中的警察的操作依赖于小偷的状态变化,
球迷的操作依赖于球赛的状态变化)
- 如果在更改一个对象的时候, 需要同时连带改变其他的对象;
- 当一个对象必须通知其他的对象, 但是你又希望这个对象和其他被通知的对象是松散耦合的;
参考自 慕课网
- 用Java实现处理日期的工具类——常用日期处理方法
- ORM查询语言(OQL)简介--实例篇
- 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警
- 【机器学习】分类算法评价
- Java中图片处理工具类——能满足各种需求
- onclicklistener到底怎么用?
- 如何入侵联网智能灯泡——LIFX智能灯泡
- Java实现的一个编号生成器工具类——5种方法
- 【机器学习】有趣的机器学习:最简明入门指南
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- 海量数据处理利器之布隆过滤器
- ORM查询语言(OQL)简介--概念篇
- Discuz! 任意文件删除漏洞重现及分析
- .NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Java面试高频知识点汇总 数据库专题
- Java面试高频知识点总结 Redis
- Java面试高频知识点总结 Spring
- 杂谈小程序
- pytest封神之路第四步 内置和自定义marker
- (译)SDL编程入门(3)事件驱动编程
- 一个简单的Angular search UI实现
- (译)SDL编程入门(2)在屏幕上显示图像
- 【Vue进阶】手把手教你在 Vue 中使用 JSX
- (译)SDL编程入门(1)Hello SDL
- Django使用Channels实现websocket
- (译)SDL编程入门(6)扩展库SDL_image
- 牛客网剑指offer-2
- 牛客网剑指offer-1
- (译)SDL编程入门(5)Surface 优化和软拉伸