观察者、发布/订阅和数据绑定之间的区别

译自: 美国《卫报》网站(http://en.wikipedia.org/wiki/Observer _ pattern)原文地址: http://en.wikipedia.org/wiki/Observer _ pattern 原文地址: http://en.wikipedia.org/wiki/Observer _ pattern 原文地址: http://en.wikipedia.org/Observer _ pattern 原文地址: http://en.wikipediaHttp://en.wikipedia.org/wiki/Publish% E2% 80% 93ordering _ pattern”rel = “ noReferrer”> Publish/Subscribe 数据绑定之间的区别是什么?

我在 Stack Overflow 上搜索了一下,没有找到任何好的答案。

我开始相信数据绑定是一个通用术语,并且有不同的实现方式,比如观察者模式或 Pub/Sub 模式。有了观察者模式,观察者会更新它的观察者。使用 Pub/Sub,0-许多发布者可以发布某些类的消息,0-许多订阅者可以订阅某些类的消息。

还有其他实现“数据绑定”的模式吗?

47241 次浏览

观察者/可观察者和发布者/订阅者模式之间有两个主要区别:

  1. 观察者/可观察 模式主要以 同步的方式实现,也就是说,当某个事件发生时,可观察者调用其所有观察者的适当方法。发布者/订阅者模式主要以 异步方式实现(使用消息队列)。

  2. 观察员/可观察员模式中,观察者意识到可观察到的。然而,在 发布者/订阅者中,发布者和订阅者 不需要了解对方。它们只是通过消息队列的帮助进行通信。

正如您正确提到的,数据绑定是一个通用术语,可以使用观察者/观察者或发布者/订阅者方法实现。数据是发布者/可观察的。

以下是我对这三点的看法:

数据绑定

从本质上说,这只是意味着“对象 Y 上的属性 X 的值在语义上与对象 B 上的属性 A 的值绑定在一起。对于 Y 如何知道或者被提供对象 B 上的更改,没有做出任何假设。

观察者,或可观察者/观察者

一种设计模式,通过这种模式,一个对象被赋予了通知他人特定事件的能力——通常使用实际事件来完成,这类似于对象中具有特定函数/方法形状的插槽。可观察者是提供通知的人,观察者接收这些通知。进去。Net,观察者可以通过“事件处理程序”形状的钩子公开事件并订阅该事件。没有对发生通知的特定机制做出假设,也没有对一个观察者可以通知的观察者数量做出假设。

酒吧/三明治

观察者/观察者模式的另一个名字(可能有更多的“广播”语义) ,这通常意味着一个更“动态”的味道——观察者可以订阅或取消订阅通知,一个观察者可以对多个观察者“喊出”。进去。NET 中,可以使用标准事件来实现这一点,因为事件是 Multicast氏委托的一种形式,因此可以支持向多个订阅方传递事件,还可以支持取消订阅。在某些情况下,Pub/Sub 的含义略有不同,通常涉及事件和事件之间更多的“匿名性”,这可以通过任意数量的抽象来实现,通常涉及一些“中间人”(如消息队列) ,他们知道所有各方,但各方彼此不知道。

数据绑定,复制

在许多“类 MVC”模式中,可观察到的公开了某种形式的“属性更改通知”,其中还包含关于特定属性更改的信息。观察者是隐式的,通常由框架创建,并通过某种绑定语法订阅这些通知,以明确标识对象和属性,而“事件处理程序”只是复制新值,可能触发任何更新或刷新逻辑。

数据绑定重新复制

数据绑定的替代实现? 好吧,这里有一个愚蠢的实现:

  • 启动一个后台线程,不断检查对象的绑定属性。
  • 如果该线程检测到自上次检查以来属性的值已更改,则将该值复制到绑定项。

我同意您关于这两种模式的结论,但是,对我来说,当我处于相同的流程中时,我使用 Obable,并且在流程间场景中使用 Pub/Sub,在这种场景中,所有各方只知道公共通道,而不知道各方。

我不知道其他的模式,或者让我这么说吧,我从来不需要其他的模式来完成这个任务。甚至大多数 MVC 框架和数据绑定实现通常在内部使用观察器概念。

如果你对行程间通讯感兴趣,我推荐你:

“企业集成模式: 设计、构建和部署消息解决方案”- Https://www.enterpriseintegrationpatterns.com/

这本书包含了很多关于如何在进程或类之间发送消息的想法,这些消息甚至可以在进程内通信任务中使用(它帮助我以一种更加松散耦合的方式进行编程)。

希望这个能帮上忙!

我有点好笑的是,这里的所有答案都试图解释 Observer 和 Pub/Sub 模式之间的微妙差异,而没有给出任何具体的例子。我敢打赌,大多数读取器仍然不知道如何通过读取一个是同步的,另一个是异步的来实现每一个。

值得注意的是: 这些模式的目标是尝试解耦代码

观察者是一种设计模式,其中一个对象(称为主体)维护一个依赖于它的对象列表(观察者) ,自动通知它们状态的任何更改。

观察者模式

这意味着 observable object有一个保存所有 observers(通常是函数)的列表。并且可以遍历这个列表,并在感觉合适的时候调用这些函数。

有关详细信息,请参阅 这个观察者模式示例。

当您希望侦听对象上的任何数据更改并相应地更新其他 UI 视图时,此模式非常有用。

但是 Cons 是 < strong > 观察者只维护一个阵列来保持观察者 (在本例中,数组是 observersList)。

它不区分如何触发更新,因为它只有一个 notify function,它触发存储在该数组中的所有函数。

如果我们希望根据不同的事件对观察员处理程序进行分组。我们只需要把 observersList修改成 Object就可以了

var events = {
"event1": [handler1, handler2],
"event2": [handler3]
}

详情请参阅 这个 pubsub 的例子

人们称这种变化为 pub/sub。所以你可以根据你发布的 events触发不同的函数。

一个具体的区别是,当观察者不再想观察时,观察者总是参与其中。但是订阅者可以停止订阅,而发布者将永远不会意识到这些取消订阅的意图