观察者模式和响应式编程有什么区别?

75

最近我经常听到响应式编程这个术语,但当我搜索时,发现它只是与观察者模式有一些相似之处。实际上,我找不到它们之间的任何区别。它们的概念差异是什么,为什么响应式编程这个术语变得如此热门?


1
http://en.wikipedia.org/wiki/Reactive_programming#Similarities_with_observer_pattern - M.Octavio
4
我看到了那个,但是没有明确描述概念上的区别。 - eonil
1
据我理解,观察者模式关注对象的更改,而响应式编程关注流(正如维基百科文章所定义的那样),观察流。 - Janaka
2个回答

74

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

传统上,您几乎总是看到上面的模式,其中x是GUI事件。大多数GUI库都是单线程的,因此不能将此线程绑定等待响应。这就是观察者模式发挥作用的地方 - 它提供了一种通用方法,可以提供“触发器”,以允许每当进行此类更改(或更普遍的OO术语中的“事件”被触发)时更新信息。在这种意义上,它为使得基本的反应式编程概念在面向对象(及有时其他)风格的语言中发生提供了一种简单的机制

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


那么简单来说,单次触发与流式触发是唯一的区别吗? - Farid

18

我是一名反应式编程专家,积极开发反应式编程的新工具,例如 causality (https://github.com/erobwen/causality)。

简单来说,反应式编程就是超越使用“回调”和“监听器”的观察者模式。在反应式编程中,假定有更高级别的自动化,平台负责管理所有数据和 UI 的依赖关系。因此,一个经验法则是,如果使用观察者模式,则不是反应式系统。

另一种区分编程范例是否为反应式的方法是,代码是否更新数据结构和 UI 组件,或者代码是否看起来只创建了 UI 组件的最初状态。因此:

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

反应式编程: 一个代码块创建 UI(也会用于后续的更新)。

例如,一种非反应式的更新 UI 的方法是添加事件监听器以监听按钮的点击事件。如果用户单击该按钮,则找到 DOM 中适当的位置,在那里设置属性、添加子元素或添加类,以实现某些效果。

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

现代和流行的响应式编程示例有React和Angular。例如,使React具有响应式能力的关键是每个组件都声明了其“render”函数来构建组件的UI。关键是这个render函数既用于组件最初渲染时,也用于数据/UI状态发生更改导致UI修改时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接