这一节我们来理解Rx的一些基本概念:
1、什么是Rx?
首先,官网的介绍是:
An API for asynchronous programming with observable streams
我们对这段话的理解有三个层次:
1、An API:它首先是一个编程接口规范,不同的语言有不同的实现,但是API接口应该是一致的。
2、For asynchronous programming:在异步编程中使用。比如子线程耗时网络请求。
3、With observable streams: 基于可观察的事件流。比如观察者模式中的观察者对被观察着的监听。
其核心设计思想:观察者模式、Iterator 模式、函数式编程
观察者模式:即定义对象间一种一对多的依赖关系,当一个对象改变状态时,则所有依赖它的对象都会被改变。
Iterator 模式: 即迭代器模式。
函数式编程:即提供一系列函数样式的方法供快速开发。
2、什么是响应式编程?
A = B + C
比如上面的代码A
被赋值为B
和C
的和,在传统的命令式编程中,如果我们修改了B
或者C
的值,当这段代码已经执行之后,A
的值并不会发生变化。而如果我们运用一种机制,当B
或者C
的值发现变化的时候,A
的值也随之改变,这样就实现了”响应式“。也可以叫做数据绑定。
3、什么是函数式编程?
函数式编程思维, 就是 用计算(函数)来表示程序, 用计算(函数)的组合来表达程序的组合的思维方式.
这里用一段伪代码的说明
/ 传统
int abs(int i) {
return i * 2;
}
int add_abs(int a, int b) {
return abs(a) + abs(b)
}
int result = add_abs(2, 3);
// 函数式
def abs = {i -> i * 2} // 传入 i 返回 i*2
def add_abs = {(a, b) -> abs(a)+abs(b)} // 传入a,b ,返回经过 a*2 + b*2 的值
int a = add_adb(1, 2)
4、函数响应式编程
如果结合响应式和函数编程,那么就会有一些有意思的事情发生啦。
例子:我们如果有一个输入框,输入的文字达到预期时,弹出提示框。
传统的话我们的话会给这个输入框添加一个监听事件,用于监听文字的输入,然后在监听方法中,去做判断是否需要弹出提示框。
input.setInputListener(inputListener) // 设置输入监听
void inputListener(input) {
if (!input.text.isEmpty()) {
if input.text.count >= 100 {
alert.show("不能输入更多了")
}
}
}
如果我们使用函数响应式编程的话,就可以用一下代码来表示
input.text
.isEmpty
.map {text.count >= 100} //
.bind {alert.show("不能输入更多了")}
这样就实现了输入与提示框的绑定。
而 Rx(RxJava) 的原理就是这种模式,在这个模式中有 4 个角色
角色 | 作用 |
---|---|
被观察者(Observable) | 产生事件 |
观察者(Observer) | 接收事件,并给出响应动作 |
订阅(Subscribe) | 连接 被观察者 & 观察者 |
事件(Event) | 被观察者 & 观察者 沟通的载体 |
在Rx中还有一个概念叫做Subject,它既是可监听序列也是观察者。它同时充当了 Observer 和 Observable 的角色。因为它是一个 Observer,它可以订阅一个或多个 Observable ;又因为它是一个 Observable ,它可以转发它收到( Observe )的数据,也可以发射新的数据。
我们以后再来慢慢分析这些基本的概念:欢迎讨论