观察者,发布/订阅和数据绑定之间的区别
观察者模式 , 发布/订阅和数据绑定有什么区别?
我search了一下,所以没有find任何好的答案。
我曾经相信的是,数据绑定是一个通用的术语,实现它的方式有很多,例如Observer Pattern或者Pub / Sub模式。 通过Observer模式,Observable可以更新观察者。 通过发布/订阅,0多个发布者可以发布某些类别的消息,并且0多个订阅者可以订阅某些类别的消息。
还有其他模式实现“数据绑定”?
这是我对三个人的看法:
数据绑定:
从本质上讲,这仅仅意味着“对象Y上的属性X的值在语义上与对象B上的属性A的值绑定在一起。对于Y如何知道或者是如何知道对象B上的变化,没有做出假设。
观察员,或可观察/观察员:
一种devise模式,通过这种devise模式,对象具有通知其他特定事件的能力 – 通常使用实际事件来完成,实际事件类似于具有特定function/方法形状的对象中的槽。 观察者是提供通知的人,观察者接收这些通知。 在.net中,observable可以暴露一个事件,观察者通过一个“事件处理程序”形钩子来订阅该事件。 关于通知发生的具体机制,以及一个观察者可以通知的观察者的数量,都没有做出假设。
发布/订阅:
Observable / Observer模式的另一个名字(也许具有更多的“广播”语义)通常意味着更“dynamic”的味道 – 观察者可以订阅或取消订阅通知,一个观察者可以向多个观察者“喊出来”。 在.net中,可以使用标准事件,因为事件是MulticastDelegate的一种forms,所以可以支持向多个订阅者传递事件,也支持取消订阅。 Pub / sub在某些上下文中的含义略有不同,通常涉及到事件和eventer之间更多的“匿名”,这可以通过任何数量的抽象来实现,通常涉及一些“中间人”(比如消息队列)各方,但各方不知道对方。
数据绑定,redux:
在许多“类似mvc”的模式中,可观察的事物揭露了某种“财产变化的通知”的方式,也包含了关于特定财产变化的信息。 观察者是隐含的,通常由框架创build,并通过一些绑定语法订阅这些通知,以明确标识对象和属性,“事件处理程序”只是复制新的值,可能触发任何更新或刷新逻辑。
数据绑定redirect:
数据绑定的替代实现? 好吧,这是一个愚蠢的:
- 后台线程开始不断检查对象的绑定属性。
- 如果该线程检测到自上次检查后属性的值已经更改,则将该值复制到绑定项目。
Observer / Observable和Publisher / Subscriber模式有两个主要区别:
-
Observer / Observable模式大部分是以同步的方式实现的,也就是说observable在发生某些事件时调用所有观察者的适当方法。 发布者/订阅者模式主要以asynchronous方式实现(使用消息队列)。
-
在Observer / Observable模式中, 观察者意识到可观察的 。 而在发布者/订阅者中 ,发布者和订阅者不需要彼此了解 。 他们只是与消息队列的帮助沟通。
正如您提到的那样,数据绑定是一个通用术语,可以使用Observer / Observable或Publisher / Subscriber方法来实现。 数据是发布者/订阅者。
我有点好笑,这里的所有答案都试图解释Observer和Pub / Sub模式之间的差别,没有给出具体的例子。 我敢打赌,大多数读者仍然不知道如何通过阅读一个是同步的,另一个是asynchronous的。
有一件事要注意的是这些模式的目标是试图解耦代码
Observer是一种devise模式,其中一个对象(称为主体)根据对象(观察者)维护一个对象列表,并自动通知他们对状态的任何改变。 观察者模式
这意味着一个observable object
有一个列表,它保留了所有的observers
(通常是函数)。 并且可以遍历这个列表,并在感觉良好的时候调用这些函数。
有关详细信息,请参阅此观察者模式示例
当您想要监听对象上的任何数据更改并相应地更新其他UI视图时,此模式是很好的。
但是Cons observables只保留一个观察者arrays。 (在这个例子中,数组是observersList
)。
它不会区分触发更新的方式,因为它只有一个notify function
,触发所有存储在该数组中的函数。
如果我们想根据不同的事件组织观察员处理程序。 我们只需要修改那个observersList
到一个Object
var events = { "event1": [handler1, handler2], "event2": [handler3] }
有关详细信息,请参阅此pubsub示例 。
人们把这种变化称为pub/sub
。 所以你可以根据你发布的events
触发不同的function。
我同意你关于这两种模式的结论,但是对于我来说,当我在同一个过程中使用Observable时,我在进程间场景中使用Pub / Sub,在这种情况下,各方只知道共同的渠道, 。
我不知道其他模式,或者让我这样说,我从来不需要另外的模式来完成这个任务。 即使大多数MVC框架和数据绑定实现通常在内部使用观察者概念。
如果您对进程间通信感兴趣,我build议您:
“企业集成模式:devise,构build和部署消息解决scheme”( http://www.addison-wesley.de/9780321200686.html )
本书包含了很多关于如何在stream程或类之间发送消息的想法,甚至可以在进程内通信任务中使用它(它帮助我以更松耦合的方式进行编程)。
我希望这有帮助!