71

最近经常听到反应式编程这个词,但是当我搜索它时,我发现它只是与观察者模式有一些相似之处。实际上,我找不到它们之间的任何区别。它们之间的概念区别是什么?为什么反应式编程这个词越来越流行?

4

2 回答 2

66

反应式编程是通过执行程序轻松传播数据流中的更改的一般范例。它本身不是一种特定的模式或实体,它是一种思想或编程风格(例如面向对象的编程、函数式编程等)。简单地说,它是一个概念,即当x一个位置发生变化或更新时,依赖于的值以x非阻塞方式在其他各个位置重新计算和更新,而不必占用等待事件发生的线程。

传统上,您几乎总是看到上面的模式x是 GUI 事件。大多数 GUI 库都是单线程的,因此您不能占用这个等待响应的线程。这就是观察者模式的用武之地——它提供了一种通用方法来提供“触发器”,以允许在进行此类更改时更新信息(或者,在更常见的 OO 术语中,当触发“事件”时)。从这个意义上说,它提供了一种简单的机制,允许响应式编程的基本概念在 OO(有时是其他)风格的语言中发生。

反应式编程的更完整概念远远超出了传统的观察者模式 - 您可以创建和订阅此类事件的发布者,设置要运行的操作,而不是仅仅对单个事件(例如用户点击)触发特定操作基于该发布者上发生的事件,应用背压来控制该发布者的速度,控制该流的线程等。

于 2013-05-20T15:29:42.550 回答
14

我是响应式编程方面的专家,我正在积极开发用于响应式编程的新工具。比如因果关系(https://github.com/erobwen/causality

一个简单的说法是,反应式编程超越了使用带有“回调”和“监听器”的观察者模式。对于反应式编程,假设平台管理所有数据和 UI 依赖项的自动化程度更高。因此,作为一般经验法则,如果使用观察者模式,那么它就不是反应式系统。

另一种判断编程范式是否响应式的方法是,您是否编写了更新数据结构和 UI 组件的代码,或者您编写的代码看起来好像它首先只创建了 UI 组件。因此:

非反应式编程:创建 UI 的代码 + 更新 UI 的代码。

反应式编程:创建 UI 的一段代码(也将用于更新)

例如,更新 UI 的一种非反应式方法是让事件侦听器来侦听按钮的单击,如果用户单击该按钮,则您会在 DOM 中找到适当的位置,在其中设置属性,添加一个孩子,或添加一个类,以使某些事情发生。

要做同样的事情,reactivley 是将按钮状态绑定到视图模式变量,然后再将要修改的属性绑定到该视图模式变量。然后,当用户按下按钮时,系统会自动知道如何更新 DOM。

反应式编程的现代和流行示例是 React 和 Angular。例如,使 React 具有反应性的是,每个组件都声明其“渲染”函数来构建组件的 UI。关键是这个渲染函数将用于组件初始渲染时,以及数据/UI 状态的更改将导致 UI 修改时。

于 2019-04-15T06:54:46.520 回答