网站首页 > java教程 正文
观察者模式
观察者模式,有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
RxJava1.0和RxJava2.0的核心思想都是观察者模式,只不过RxJava2.0在RxJava1.0的基础对一些方法进行了优化,方便于开发者更好地理解其编程思想,同时又增加了一部分新的方法解决1.0存在的问题(背压等)。
使用示例
创建被观察者
Observable observable=Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
}
});
Observable(被观察者)通过create方法生成对象,里面放的参数ObservableOnSubscribe<T>,重写subscribe方法,里面写具体的计划,在subscribe中的ObservableEmitter<String>对象的Emitter是发射器的意思。
ObservableEmitter有三种发射的方法,分别是void onNext(T value)、void onError(Throwable error)、void onComplete(),onNext方法可以无限调用,Observer(观察者)所有的都能接收到,onError和onComplete是互斥的,Observer(观察者)只能接收到一个,OnComplete可以重复调用,但是Observer(观察者)只会接收一次,而onError不可以重复调用,第二次调用就会报异常。
创建观察者
Observer<String> observer =new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable=d;
}
@Override
public void onNext(String value) {
if ("2".equals(value)){
mDisposable.dispose();
return;
}
}
@Override
public void onError(Throwable e) {
Log.error("error="+e.getMessage());
}
@Override
public void onComplete() {
Log.log("onComplete()");
}
};
通过new创建接口,并实现其内部的方法,onNext、onError、onComplete跟被观察者发射的方法一一对应。onSubscribe(Disposable d)里面的Disposable对象为订阅关系,如果不想再订阅了,可以调用 mDisposable.dispose()取消订阅。
建立订阅关系
observable.subscribe(observer);
RxJava2的五种观察者模式
- Observable:能够发射0或n个数据,并以成功或者错误事件终止
- Flowable:能够发射0或n个数据,并以成功或者错误事件终止。支持背压,可以控制数据源发射的速度,唯一支持背压
- Single:只发射单个数据或者错误事件
- Completable:从来不发射数据,只处理onComplete和onError事件。可以看成Rx的Runnable
- Maybe:能够发射0或者1个数据,要么成功,要么失败。有点类似于Optional
Flowable
Flowable支持堵塞式背压。Flowable可以看成Observable新的实现,它支持背压,同时实现Reactive Streams的Publisher接口。Flowable所有的操作符强制支持背压,不过幸运的是,Flowable中的操作符大多与Observable类似。
使用Observable较好的场景
- 一般处理最大不超过1000条数据,并且几乎不会出现内存溢出
- GUI鼠标事件,基本不会背压(可以结合 sampling/debouncing操作)
- 处理同步流
使用Flowable较好的场景
- 处理以某种方式产生超过10KB的元素
- 文件读取与分析
- 读取数据库记录,也是一个堵塞的和基于拉取模式
- 网络I/O
- 创建一个响应式非堵塞接口
猜你喜欢
- 2024-12-17 Spring Boot Event 观察者模式,轻松带你实现业务解耦
- 2024-12-17 [Android开发]使用观察者的正确姿势
- 2024-12-17 Spring Boot 实战:使用观察者模式实现实时库存管理
- 2024-12-17 深刻的观察者模式 观察者模式的问题
- 2024-12-17 Spring Boot 中的观察者模式:多个主题的最佳实践
- 2024-12-17 设计模式——观察者模式 观察者设计模式结构图
- 2024-12-17 java设计模式-观察者模式 java 观察者模式 流程审批
- 2024-12-17 Java中的设计模式(一):观察者模式
- 2024-12-17 观察者模式图文详解 观察者模式好处
- 2024-12-17 Java 观察者模式 java观察者模式指令是什么
你 发表评论:
欢迎- 04-27微服务部署架构设计详解(图文全面总结)
- 04-27Java微服务架构选型与对比:一场技术流派的巅峰对决
- 04-27微服务架构下Java的最佳实践
- 04-27Java微服务架构选型:优雅拆分与高效整合
- 04-27微服务架构下的Java代码拆分策略:像拼图一样构建系统
- 04-27微服务架构下的Java最佳实践
- 04-27微服务架构下Java的挑战与机遇
- 04-27微服务架构下Java事务管理的艺术
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)