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 吗?的主要内容,如果未能解决你的问题,请参考以下文章