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
Events 观察者模式与事件驱动方法的区别_Events_Design Patterns_Observer Pattern - Fatal编程技术网

Events 观察者模式与事件驱动方法的区别

Events 观察者模式与事件驱动方法的区别,events,design-patterns,observer-pattern,Events,Design Patterns,Observer Pattern,我总是发现观察者模式几乎与通常的事件驱动方法相似。事实上,我几乎相信它们实际上只是指同一事物的不同名称。它们都使用类似的概念作为侦听器,甚至在实现中,它们几乎是一样的,即使用回调方法/函数来执行操作。至少在Java中是这样 在其他语言(如Actionscript/Flex)中,事件更为用户友好,看起来可能不仅仅是观察者模式定义的。但是,这些概念听起来还是一样的 但这是真的吗?观察者模式是否与通常的事件驱动编程风格相同?是的,它们基本相同 事件类似于某些语言的“内置”观察者模式模板 因此,您不会用

我总是发现观察者模式几乎与通常的事件驱动方法相似。事实上,我几乎相信它们实际上只是指同一事物的不同名称。它们都使用类似的概念作为侦听器,甚至在实现中,它们几乎是一样的,即使用回调方法/函数来执行操作。至少在Java中是这样

在其他语言(如Actionscript/Flex)中,事件更为用户友好,看起来可能不仅仅是观察者模式定义的。但是,这些概念听起来还是一样的


但这是真的吗?观察者模式是否与通常的事件驱动编程风格相同?

是的,它们基本相同

事件类似于某些语言的“内置”观察者模式模板

因此,您不会用支持事件的语言真正实现观察者模式,因为它们已经提供了您所需要的内容。

另一方面,您可以使用observer模式以缺少事件的语言编写事件驱动。

observer模式是一个非常特殊的实例。事件驱动可以意味着任何事情。在大多数观察者模式实现中,观察者是观察被观察者的对象。当观察者发生变化时,将调用观察者的方法。严格地说,这不是一个“事件”。这意味着:对被观察者的各种不同动作,通常会导致在观察者中调用不同的方法。语义“what”在方法中发生了更改。
在事件驱动系统中,基本上只有一个消费对象/方法和消息,即事件中发生了什么或发生了什么。这可以是任何东西,而且不限于观察某事物的想法!这意味着:在事件驱动的系统中,通过添加新的事件类型,可以获得新的语义。在观察者模式中,通常通过向观察者类添加方法来添加语义。但是:没有人阻止您将观察器实现为ChangeEvents的特殊列表

第一个区别可能是,事件系统总是有一个eventdispatchthread,它将观察对象与其观察者分离,因此事件可能不会立即到达观察者。当真实的观察对象直接调用观察者方法时,事件驱动的观察对象将其事件放入事件队列中。然后EDT将这些事件发送给注册的侦听器。

当发布者或主题发生状态更改时

  • 事件驱动体系结构(是一种消息驱动体系结构),负责以异步方式向订阅者传递消息

  • 观察者模式(是一种软件设计模式),负责同步地命令订阅者做某事


我已经搜索了一些相同的问题。 对于这个线程,我从AngelO'Sphere的“What semantics”中找到了一点,从Spacerat的“Dispatcher”中找到了一点


这两点是我的理解,它将驾驶员和观察者模式区分开来。至少从规范的解释来看,“观察者模式”通常表示一旦“主体”发生变化,并且通过调用订阅者或监听者提供的接口来实现“调度”,则立即广播。而对于事件驱动,在“主体”和“观察者”之间总是有另一层。称为“调度程序”或使用“事件队列”。这提供了“延迟”“根据不同的事件类型,处理以减少CPU使用,并提供调用不同接口的特定功能

两者的基本区别在于耦合和同步行为。如果我们坚持观察者模式,我们说只有一个信号源,它将是同步的,而另一方面,对于事件,我们将双方解耦,以便独立工作,同时考虑将来可能有多个事件源,而不需要任何代码更改。事件帮助我们接受异步设计。所有反应式编程库都为事件驱动设计提供了很好的支持。

来源:

观察者模式是一种软件设计模式,其中对象, 名为subject,维护其从属项的列表,名为 观察者,并自动通知他们任何状态更改, 通常通过调用他们的方法之一

它主要用于实现分布式事件处理系统,例如 “事件驱动”软件。大多数现代语言,如Java和C# 内置了实现观察者模式的“事件”结构 组件,便于编程和简短的代码

观察者模式更加抽象和理论化。事件是一种(通常是内置的)实现,但是正如Angel的回答中所指出的,除了在观察者模式中严格定义的以外,事件往往能够用于其他一些情况

事件驱动编程是一个定义范例的术语。鉴于 可观察模式是制作应用程序的设计解决方案 事件驱动


干杯

我试着做得很简单,因为这也帮了我一次忙

作为观察者和被观察者思考。取而代之的是,被观察者标记一个改变的集合,观察者向被观察者请求已经改变的内容,被观察者向观察者广播一个对象(事件携带状态),其中包含关于改变的所有相关信息。所以在观察者和被观察者之间实际上还有一个例子


综合这个问题的多个答案,再加上我自己的经验,观察者模式和事件驱动(Pub-Sub)架构之间的关键区别在我看来是:

在Observer模式中,Observed维护对其Observers的引用

而在酒吧里,第