观察者模式和事件驱动方法之间的区别

我总是发现观察者模式几乎类似于通常的事件驱动方法。 实际上,我几乎相信它们实际上是指同一事物的不同名称。 它们都使用类似的概念来作为一个监听器,甚至在实现中,它们几乎是一样的,那就是有一个callback方法/函数来执行一个动作。 这至less在Java中。

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

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

观察者模式是一个非常特殊的例子。 事件驱动可能意味着什么。 在大多数观察者模式实现中,观察者是观察观察者的对象。 当观察者改变时,观察者的方法被调用。 严格来说这不是一个“事件”。 这意味着:对观察者采取各种不同的行动,通常会导致观察者采用不同的方法 。 这个方法中的“what”被修改了。 在事件驱动系统中,你基本上有一个消费对象/方法,消息是什么被改变或事件中发生了什么。 这可以是任何事情,并不限于观察事物的想法! 这意味着:在事件驱动系统中,您可以通过添加新的事件types来获得新的语义。 在观察者模式中,通常通过向Observer类添加方法来添加语义。 然而,没有人阻止你实现一个Observer作为ChangeEvents的特殊Listers。

当发布者或主题发生状态变化时,

  • 事件驱动体系结构(是一种消息驱动体系结构),负责消息asynchronous传递给订阅者。

  • 观察者模式(Observer Pattern)(是一种软件devise模式),负责命令用户同步执行某些操作。

1号差异可能是,事件系统总是有一个eventdispatchthread,它将观察者与观察者分开,所以事件可能不会立即到达观察者。 尽pipe真正的可观察者直接调用观察者方法,事件驱动的观察者却将他们的事件放入事件队列中。 然后EDT将这些事件传送给注册的听众。

我已经search了一下这个相同的问题。 对于这个线程,我从Angel O'Sphere那里find了关于“什么语义”的点,并且从“Dispatcher”的Spacerat指出有帮助。

这两点是我的理解,即将Even-Driver从观察者模式中区分出来。 至less从标准的解释来看,“观察者模式”通常代表一个直接的广播,一旦“主题”改变了,“调度”就通过调用用户或监听者提供的接口来实现。 而对于事件驱动,在“主题”和“观察者”之间总是存在另外一层,可以称之为“分派器”,也可以使用“事件队列”,这就提供了“延迟”处理以减lessCPU使用率,接口取决于不同的事件types。

是的,他们主要是一样的。

事件就像某些语言的“内置”观察者模式模板。

因此,你不会真的在支持事件的语言中实现观察者模式,因为他们已经提供了你正在寻找的东西。
另一方面,您可以使用观察者模式编写缺less事件的语言的事件驱动。

两者的基本区别在于耦合和同步行为。 如果我们坚持观察者模式,我们说只有一个信号源,它是同步的,而另一方面,事件,我们分离双方独立工作,同时考虑有多个来源的可能性事件在未来没有任何代码更改。 事件帮助我们接受asynchronousdevise。 所有Reactive编程库都为事件驱动devise提供了很好的支持。

维基百科 :

观察者模式是一种软件devise模式,在这种模式中,一个被称为主体的对象维护一个称为观察者的依赖项列表,并且通常通过调用其中一个方法来自动通知它们的状态变化。

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

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