观察者模式和反应式编程之间有什么区别?

时间:2013-05-20 15:21:34

标签: observer-pattern reactive-programming

最近我听到了很多关于反应式编程的术语。但是当我搜索它时,我发现的只是与观察者模式的一些相似之处。实际上,我发现他们之间没有任何不同。它们之间的概念差异以及为什么术语反应式编程正在嗡嗡作响?

2 个答案:

答案 0 :(得分:40)

反应式编程是通过执行程序轻松传播数据流中的更改的一般范例。它不是特定的模式或实体本身,它是一种想法或编程风格(例如面向对象的prorgamming,函数式编程等)。松散地说,它是x在一个更改或更新时的概念位置,依赖于x的值的东西会在其他各个位置重新计算和更新,而且不会大惊小怪。

传统上,你总是看到上面的模式,其中x是一个GUI事件,而这就是观察者模式的来源 - 它提供了一种通用的方法来提供一个“触发器”来允许信息每当进行这样的更改时更新(或者,更常见的OO术语,当“事件”被触发时)。在这个意义上,它提供了一个简单的机制,用于允许反应式编程的基本概念以OO(有时是其他)风格的语言发生。

反应式编程的更全面概念在某种程度上扩展了传统的观察者模式 - 您可以创建和订阅此类事件的流,而不是仅仅针对单个事件(例如用户点击)触发特定操作,并将操作设置为基于该流中发生的事件运行。

答案 1 :(得分:2)

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

一种简单的说法是,反应式编程不仅可以使用带有“回调”和“监听器”的观察者模式。使用反应式编程时,假设平台可以管理所有数据和UI依赖项,因此具有更高的自动化水平。因此,作为一般经验法则是,如果使用观察者模式,则它不是反应性系统。

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

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

反应式编程: 创建用户界面的代码块(也将用于更新)

例如,更新用户界面的一种非反应方式是让事件侦听器侦听按钮的单击,如果用户单击该按钮,则可以在DOM中找到合适的位置设置属性,添加子项或为其添加类,以使某些事情发生。

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

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