Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller 观察者、发布/订阅和数据绑定之间的差异_Model View Controller_Design Patterns_Data Binding_Observer Pattern_Publish Subscribe - Fatal编程技术网

Model view controller 观察者、发布/订阅和数据绑定之间的差异

Model view controller 观察者、发布/订阅和数据绑定之间的差异,model-view-controller,design-patterns,data-binding,observer-pattern,publish-subscribe,Model View Controller,Design Patterns,Data Binding,Observer Pattern,Publish Subscribe,、和之间有什么区别 我搜索了一下堆栈溢出,没有找到任何好的答案 我逐渐相信,数据绑定是一个通用术语,有不同的实现方式,如观察者模式或发布/订阅模式。使用观察者模式,可观察者更新其观察者。通过Pub/Sub,0-many发布者可以发布特定类别的消息,0-many订阅者可以订阅特定类别的消息 还有其他实现“数据绑定”的模式吗?观察者/可观察者和发布者/订阅者模式之间有两个主要区别: 观察者/可观察者模式主要以同步方式实现,即当某个事件发生时,可观察者调用其所有观察者的适当方法。发布者/订阅者模式主要

之间有什么区别

我搜索了一下堆栈溢出,没有找到任何好的答案

我逐渐相信,数据绑定是一个通用术语,有不同的实现方式,如观察者模式或发布/订阅模式。使用观察者模式,可观察者更新其观察者。通过Pub/Sub,0-many发布者可以发布特定类别的消息,0-many订阅者可以订阅特定类别的消息


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

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

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

  • 观察者/可观察的模式中,观察者知道可观察的。然而,在发布者/订阅者中,发布者和订阅者不需要相互了解。它们只是在消息队列的帮助下进行通信


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

    以下是我对三个方面的看法:

    数据绑定 本质上,这只是意味着“对象Y上的属性X的值在语义上与对象B上的属性A的值绑定。没有假设Y如何知道或反馈对象B上的更改

    观察者,或可观察/观察者 一种设计模式,通过这种模式,一个对象能够通知其他人特定事件——通常使用实际事件来完成,这有点像对象中具有特定函数/方法形状的插槽。可观察者是提供通知的人,观察者接收这些通知。在.net中,观察者able可以公开一个事件,观察者使用“事件处理程序”形状的钩子订阅该事件。没有对通知发生的具体机制进行假设,也没有对一个观察者可以通知的观察者数量进行假设

    发布/订阅 Observable/Observator模式的另一个名称(可能有更多的“广播”语义),这通常意味着更“动态”的风格——观察者可以订阅或取消订阅通知,而一个Observable可以“呼喊”“给多个观察员。在.NET中,可以使用标准事件进行此操作,因为事件是MulticastDelegate的一种形式,因此可以支持向多个订阅者传递事件,也支持取消订阅。Pub/Sub在某些上下文中的含义稍有不同,通常涉及事件和事件之间更多的“匿名性”,这可以通过任何数量的抽象来实现,通常涉及一些“中间人”(如消息队列),他们了解所有各方,但各方并不相互了解

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

    数据绑定重新复制 数据绑定的替代实现?好吧,这里有一个愚蠢的例子:

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

    我同意你关于这两种模式的结论,但是,对我来说,我在同一流程中使用Observable,在流程间场景中使用Pub/Sub,其中各方只知道公共渠道,而不知道各方

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

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

    “企业集成模式:设计、构建和部署消息传递解决方案”-

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


    我希望这有帮助

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

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

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

    这意味着一个
    可观察对象
    有一个列表,其中保存了它的所有
    观察者
    (通常是函数)。并且可以遍历此列表并在感觉合适时调用这些函数

    有关详细信息,请参见示例

    当您希望侦听对象上的任何数据更改并更新其他UI视图时,此模式非常有用
    var events = {
        "event1": [handler1, handler2],
        "event2": [handler3]
    }