EventListener是一个Observable吗?

时间:2011-05-09 19:54:29

标签: design-patterns observer-pattern event-listener observable

我目前正在关注设计模式课程,并想知道EventListenerObservable

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

4 个答案:

答案 0 :(得分:22)

Observable只是一个可以观察其动作的对象。所以你可以听一个动作然后被告知动作发生的任何事情都是Observable

这意味着事件监听器就是一个。因为您可以收听事件,事件会立即通知您他们已经发生了事件。

当有人说Observable时我个人认为是事件。这是我可以观察到的切割器示例。一个类似的例子是发布 - 订阅系统,它只是一个不同名称的事件(它确实有微妙的不同用例)。

答案 1 :(得分:10)

根据我的经验,事件监听器模式与Observer Design Pattern不同。它不仅仅是一个不同的名称,也不是其中的一部分。

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

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

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

数据结构也不同。在Listener Design Pattern中,只有一个全局字典可以将每种类型的事件映射到其处理方法。此映射是1对1。在观察者模式中,每个观察到的主体都维护一个观察者列表。这种映射是1对多的:一个受许多观察者的影响。这种1对多主题 - 观察者关系可能存在多个实例。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

是的,看起来像是一个事件队列,你注册特定事件的监听器就是观察者模式的一个例子。