Observer,Pub/Sub和Data Binding之间的区别

Jes*_*ess 156 data-binding model-view-controller design-patterns publish-subscribe observer-pattern

观察者模式,发布/订阅数据绑定有什么区别?

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

我所相信的是,数据绑定是一个通用术语,有不同的实现方式,如观察者模式或发布/子模式.使用Observer模式,Observable更新其观察者.使用Pub/Sub,0-many发布者可以发布某些类的消息,0-many订阅者可以订阅某些类的消息.

是否有其他实施"数据绑定"的模式?

Par*_*ram 151

Observer/Observable和Publisher/Subscriber模式之间有两个主要区别:

  1. Observer/Observable模式主要以同步方式实现,即当某些事件发生时,observable调用其所有观察者的适当方法.的发行者/订户图案在一个实施大多异步方式(使用消息队列).

  2. Observer/Observable模式中,观察者知道可观察的.然而,在发布者/订阅者中,发布者和订阅者不需要彼此了解.他们只是在消息队列的帮助下进行通信.

正如您所提到的,数据绑定是一个通用术语,可以使用Observer/Observable或Publisher/Subscriber方法实现.数据是发布者/订阅者.

  • 通常,observable有一个观察者列表(它遍历此列表以向所有人发送事件).发布者通常只知道发布其事件/消息的队列.它不知道有多少消费者订阅了该队列. (13认同)
  • 对我来说,这是两者之间的关键区别:___而且,在观察者模式中,观察者都知道可观察到的.然而,在Pub/Sub中,出版商和消费者都不需要彼此了解.他们只是在消息队列的帮助下进行通信.___很棒的答案! (7认同)
  • 我正在阅读O'Reilly的*JavaScript Web Applications*(http://shop.oreilly.com/product/0636920018421.do).在第2章中,Alex使用JS事件实现了一个`pub/sub`.它是一种回调类型的实现,但它是一个**同步**示例. (6认同)
  • 我没有读过这本书,但如果它是用JS"事件"实现的,它将是异步的,因为事件根据定义是异步的. (4认同)
  • 嗨Jess,当然你是对的.这些术语没有标准定义 (3认同)
  • 嗨帕拉姆。我喜欢你的回答。真的很棒。我只是对其进行了改进,以说明发布/订阅并不总是异步的。参考:http://stackoverflow.com/questions/15924014/asynchronous-or-synchronous-calling-of-event-handlers-in-javascript (2认同)
  • @Param 说 JS 事件根据定义始终是异步的是错误的。受信任的浏览器事件是异步的,但由库代码调度的所有事件(通过发布消息调度的消息事件除外)都是同步的。 (2认同)

Jer*_*all 135

以下是我对三者的看法:

数据绑定

本质上,在核心,这只意味着"对象Y上的属性X的值在语义上与对象B上的属性A的值绑定.没有假设Y如何知道或对对象B进行更改.

观察者或观察者/观察者

一种设计模式,通过该模式,对象充满了向其他人通知特定事件的能力 - 通常使用实际事件来完成,实际事件类似于具有特定功能/方法形状的对象中的槽.可观察者是提供通知的人,观察者接收这些通知.在.net中,observable可以公开一个事件,观察者使用"事件处理程序"形状的钩子订阅该事件.没有关于通知发生的具体机制的假设,也没有关于一个观察者可以通知的观察者数量的假设.

发布/订阅

Observable/Observer模式的另一个名称(可能带有更多"广播"语义),通常意味着更"动态"的味道 - 观察者可以订阅或取消订阅通知,一个观察者可以向多个观察者"喊出".在.NET中,可以使用标准事件,因为事件是MulticastDelegate的一种形式,因此可以支持向多个订阅者传递事件,并且还支持取消订阅.Pub/Sub在某些上下文中的含义略有不同,通常涉及事件和eventer之间更多的"匿名",这可以通过任何数量的抽象来促进,通常涉及一些知道所有的"中间人"(例如消息队列)各方,但各方不了解对方.

数据绑定,Redux

在许多"类似MVC"的模式中,observable暴露了某种方式的"属性更改通知",其中还包含有关已更改的特定属性的信息.观察者是隐式的,通常由框架创建,并通过一些绑定语法订阅这些通知以专门标识对象和属性,"事件处理程序"只是复制新值,可能触发任何更新或刷新逻辑.

数据绑定重做Redux

数据绑定的另一种实现方式?好的,这是一个愚蠢的:

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

  • 老实说,我已经厌倦了听到"pub/sub又名观察者模式",他们完全不是一回事.Pub/sub是一个事件系统,观察者模式*使用*事件系统在对象的更改时发布事件AUTOMATICALLY.如果您在更改对象时手动发出事件,则不使用观察者模式. (6认同)

Qia*_*ang 20

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

需要注意的一点是:这些模式的目标是尝试解耦代码

Observer是一种设计模式,其中一个对象(称为主体)根据它(观察者)维护一个对象列表,自动通知它们状态的任何变化.

观察者模式

这意味着它observable object有一个列表,它保存所有它observers(通常是函数).并且可以遍历此列表并在感觉良好的时候调用这些功能.

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

当您想要侦听对象上的任何数据更改并相应地更新其他UI视图时,此模式很好.

但Cons是Observable只维护一个数组来保持观察者 (在这个例子中,数组是observersList).

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

如果我们想根据不同的事件对观察者处理程序进行分组.我们只需要修改observersList一个Object

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此pubsub示例.

人们把这种变化称为pub/sub.因此,您可以根据events您发布的内容触发不同的功能.


Raf*_*afa 9

我同意你关于这两种模式的结论,但是,对我来说,当我处于相同的过程中时我使用Observable并且我在进程间场景中使用Pub/Sub,其中所有方只知道公共信道但不知道各方.

我不知道其他模式,或者让我这样说,我从来没有需要另外的模式来完成这项任务.甚至大多数MVC框架和数据绑定实现通常也在内部使用观察者概念.

如果您对进程间通信感兴趣,我建议您:

"企业集成模式:设计,构建和部署消息传递解决方案" - http://www.addison-wesley.de/9780321200686.html

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

我希望这有帮助!