观察者,发布/订阅和数据绑定之间的区别
观察者模式 , 发布/订阅和数据绑定有什么区别?
我在Stack Overflow上搜索了一下,没有找到任何好的答案。
我曾经相信的是数据绑定是一个通用术语,实现它的方式有很多,例如Observer Pattern或Pub / Sub模式。 通过观察者模式,Observable可以更新观察者。 通过发布/订阅,0多个发布者可以发布某些类的消息,并且0多个订阅者可以订阅某些类的消息。
是否有其他模式实施“数据绑定”?
以下是我对三件事的看法:
数据绑定
从本质上讲,这仅仅意味着“对象Y上的属性X的值在语义上绑定到对象B上的属性A的值。对Y如何知道或在对象B上如何进行更改没有做出假设。
观察员,或可观察/观察员
一种设计模式,通过这种设计模式,对象具有通告其他特定事件的能力 - 通常是使用实际事件完成的,这类似于具有特定功能/方法形状的对象中的插槽。 观察者是提供通知的人,观察者接收这些通知。 在.net中,observable可以暴露一个事件,观察者通过一个“事件处理程序”形钩子来订阅该事件。 对于发生通知的具体机制没有做出假设,也没有关于一个观察员可以通知的观察员人数的假设。
发布/订阅
Observable / Observer模式的另一个名字(或许具有更多的“广播”语义)通常意味着更“动态”的味道 - 观察者可以订阅或取消订阅通知,一个观察者可以向多个观察者“喊出来”。 在.NET中,可以将标准事件用于此目的,因为事件是MulticastDelegate的一种形式,因此可以支持向多个订户传递事件,并且还支持取消订阅。 Pub / Sub在某些上下文中的含义略有不同,通常涉及事件和eventer之间更多的“匿名”,这可以通过任何数量的抽象来促进,通常涉及某些“中间人”(比如消息队列)各方,但各方不知道对方。
数据绑定,Redux
在许多“类似MVC”的模式中,可观察事物揭露了某种“财产变更通知”的方式,其中还包含有关特定财产变化的信息。 观察者是隐含的,通常由框架创建,并通过一些绑定语法订阅这些通知以明确标识对象和属性,而“事件处理程序”只是将新值复制过来,可能触发任何更新或刷新逻辑。
数据绑定re Redux
数据绑定的替代实现? 好吧,这是一个愚蠢的:
Observer / Observable和Publisher / Subscriber模式之间有两个主要区别:
Observer / Observable模式主要是以同步的方式实现的,也就是说,observable在发生某些事件时会调用其所有观察者的适当方法。 发布者/订阅者模式主要以异步方式实现(使用消息队列)。
在Observer / Observable模式中, 观察者知道可观察的事物 。 而在发布者/订阅者中 ,发布者和订阅者不需要彼此了解 。 他们只是在消息队列的帮助下进行通信。
正如您提到的那样,数据绑定是一个通用术语,可以使用Observer / Observable或Publisher / Subscriber方法来实现。 数据是发布者/订阅者。
我有点好笑,这里的所有答案都试图解释Observer和Pub / Sub模式之间的细微差别,但没有给出具体的例子。 我敢打赌,大多数读者仍然不知道如何通过读取一个是同步的而另一个是异步的来实现每个读取器。
有一点要注意的是: 这些模式的目标是试图解耦代码
Observer是一种设计模式,其中一个对象(称为主体)根据对象(观察者)维护一个对象列表,并自动通知他们对状态的任何更改。
观察者模式
这意味着observable object
有一个列表,它保留了所有的observers
(通常是函数)。 并且可以遍历这个列表并在感觉很好的时候调用这些函数。
详细信息请参阅此观察者模式示例。
当您想要侦听对象上的任何数据更改并相应地更新其他UI视图时,此模式非常有用。
但是Cons是Observable只维护一个数组来保持观察者 (在这个例子中,数组是observersList
)。
它不会区分触发更新的方式,因为它只有一个notify function
,它会触发存储在该数组中的所有函数。
如果我们想根据不同的事件组织观察员处理程序。 我们只需要将这个observersList
修改为一个Object
var events = {
"event1": [handler1, handler2],
"event2": [handler3]
}
有关详细信息,请参阅此pubsub示例。
人们称这种变化为pub/sub
。 所以你可以根据你发布的events
触发不同的功能。