我目前正在关注设计模式课程,并想知道EventListener
是Observable
?
我之间并没有真正看出它们之间的区别,因为它们都有一个订阅者列表,并在发生变化时通知这些订阅者。
答案 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)
是的,看起来像是一个事件队列,你注册特定事件的监听器就是观察者模式的一个例子。