EventListener 是 Observable 吗?

Posted

技术标签:

【中文标题】EventListener 是 Observable 吗?【英文标题】:Is an EventListener an Observable? 【发布时间】:2011-08-21 22:59:48 【问题描述】:

我目前正在学习有关设计模式的课程,并且想知道EventListener 是否是Observable

我真的看不出它们之间有什么区别,因为它们都有一个订阅者列表,并在发生变化时通知这些订阅者。

【问题讨论】:

我会说事件监听器是一个观察者,不是吗? Observer Design Pattern vs “Listeners” 【参考方案1】:

Observable 只是一个对象,您可以在其中观察它的动作。所以任何你可以听到一个动作然后被告知动作发生的地方都是Observable

这意味着一个事件监听器是一个。因为您可以监听事件并且事件会立即通知您它们已经发生。

当有人说Observable我个人认为事件。这是我关于什么是 observables 的千篇一律的例子。一个类似的例子是发布-订阅系统,它只是不同名称的事件(它确实有细微的不同用例)。

【讨论】:

【参考方案2】:

根据我的经验,事件侦听器模式与观察者设计模式不同。它不仅仅是一个不同的名称,或者是其中的一部分。

我必须具体谈谈这个。例如,这个page 给出了一个事件监听系统的c# 实现。在这个系统中,一个监听器用一个单例类Events注册它的事件处理函数,并声称它可以处理一个特定类型的事件。 Events 维护一个字典来将每种类型的事件映射到它的处理函数。另一方面,任何想要触发事件的类都需要通过单例函数Events.instance.Raise()来实现。

这里我们可以看到 3 个不同之处:

首先这两种模式的目的不同:监听器设计模式是将事件检测/引发代码与事件处理代码解耦,以便在更改或添加新的事件处理代码时,不影响其他事件处理代码;观察者设计模式就是让一些对象跟随另一个对象的变化。

数据结构也不同。在侦听器设计模式中,只有一个全局字典将每种类型的事件映射到其处理方法。此映射是一对一的。在观察者模式中,每个被观察对象都维护一个观察者列表。这种映射是一对多的:一个主体对多个观察者。这种一对多的主体-观察者关系可以有多个实例。

行为不同。在侦听器设计模式中,当事件发生时,事件引发者会通知全局中介(单例 Events.instance),因为它没有关于事件处理程序的信息。在观察者模式中,当发生任何变化时,被观察者直接通知所有观察者。

【讨论】:

【参考方案3】:

我自己也通过查看 JDK 的源代码进行了更多研究。我认为它们之间的唯一区别是Observable 在添加Observers 时使用同步,而EventListener 没有(至少AbstractButton 没有)。

【讨论】:

【参考方案4】:

是的,您为特定事件注册侦听器的事件队列似乎是观察者模式的一个示例。

【讨论】:

以上是关于EventListener 是 Observable 吗?的主要内容,如果未能解决你的问题,请参考以下文章

AS3 : EventListener 不会在 [IF] 中删除

EventListener 永远不会被击中

DOM EventListener

EventListener()

EventListener 在悬停时显示隐藏

当由 EventListener 调用时,useState 挂钩设置器仅运行一次