观察者模式和反应式编程有啥区别?

Posted

技术标签:

【中文标题】观察者模式和反应式编程有啥区别?【英文标题】:What is difference between observer pattern and reactive programming?观察者模式和反应式编程有什么区别? 【发布时间】:2013-05-15 04:52:30 【问题描述】:

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

【问题讨论】:

en.wikipedia.org/wiki/… @M.Octavio 我也看到了,但没有关于概念差异的明确描述。 据我了解,不同之处在于观察者模式关注对响应式编程关注流(如 Wiki 文章定义)的对象的更改,观察流。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

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

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

【讨论】:

以上是关于观察者模式和反应式编程有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

反应器模式(Reactor Pattern)和观察者模式(Observer pattern)的区别

JAVA设计模式——观察者设计模式和Reactor反应堆设计模式

反应器模式 vs 观察者模式

Java观察者模式:轻松实现对象间的一对多依赖

反应式编程reactor简单理解

如何实现Application event,观察者模式