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

最近我经常听到 响应式编程这个词,但是当我搜索它的时候,我发现它和 观察者模式只有一些相似之处。事实上,我找不出他们之间有什么不同。它们在概念上的区别是什么? 为什么 响应式编程这个术语如此流行?

18470 次浏览

响应式编程是通过程序执行轻松地传播数据流中的变化背后的一般范例。它不是一个特定的模式或实体本身,它是一个想法,或编程风格(如面向对象编程,函数式编程,等等)宽泛地说,这是一个概念,当 x的变化或更新在一个位置,取决于 x的价值的事情是重新计算和更新在各种其他位置的非阻塞的方式,而不必绑定线程坐在那里等待事件发生。

传统上,您几乎总是看到上面的模式,其中 x是 GUI 事件。大多数 GUI 库都是单线程的,因此您不能将这个线程绑定在一起等待响应。这就是观察者模式发挥作用的地方——它提供了一种通用的方法来提供一个“触发器”,允许在发生这种更改时(或者用更常见的面向对象术语来说,在触发“事件”时)更新信息从这个意义上说,它提供了一个简单的 机械装置,允许 非常的基本概念响应式编程发生在面向对象(有时是其他)样式的语言中。

响应式编程的完整概念远远超出了传统的观察者模式——你可以创建并订阅这些事件的发布者,根据发布者发生的事件设置运行的动作,施加反压力来控制发布者的速度,控制流的线程,等等。

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

一个简单的说法是,响应式编程不仅仅是使用观察者模式的“回调”和“监听器”。有了响应式编程,就可以假设平台在管理所有数据和用户界面依赖关系方面具有更高的自动化水平。因此,根据一般的经验法则,如果使用了观察者模式,那么它就不是一个反应系统。

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

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

响应式编程 创建 UI 的代码块(也将用于更新)

例如,更新 UI 的一种非反应式方法是让一个事件监听器监听按钮的单击,如果用户单击了该按钮,那么您就可以在 DOM 中找到合适的位置,在这里您可以设置属性、添加子类或添加一个类来实现某些操作。

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

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