观察器设计模式与“监听器”

在我看来,GoF 中描述的 Observer 设计模式实际上与各种工具包中的 Listener 相同。这两个概念之间有区别吗? 或者监听器和观察器实际上是同一件事情。

(我不是在寻找任何特定的计算机语言实现,我只是想从设计的角度来理解其中的差异(如果有的话)。是的,我知道关于 SO 的类似问题有几个答案,但是它们都根植于关于特定语言的具体问题——我在寻找一个设计上的答案,而不是语言上的答案。)

62583 次浏览

倾听者很可能是观察者模式的实现。侦听器实际上是在等待给定对象上发生的事件,而这正是观察器所做的。

我知道你们不是在寻找一个特定语言的答案,但是抽象地谈论这些东西有点困难。所以如果我要调查这个。NET 中打开一个包含侦听器的程序集。NET 反射器,它将允许我反汇编和检查其逻辑对设计模式。

“聆听者”一词是否指观察者模式,将取决于上下文。例如,JavaSwing 的“事件监听器”是一个观察者模式实现的一部分,而。网络“跟踪监听器”则不是。

框架作者为参与给定模式实现的组件分配不同的名称并不罕见,但是在讨论模式本身时通常使用正式的模式名称。

关于设计,给定模式的实现常常会受到所使用的语言和平台的影响。因此,在给定框架内的观察者模式的特定实现(可能恰好使用术语“侦听器”来描述 ConcreteObserver 的角色)可能与设计模式书中描述的略有不同。

Gamma 等人(GoF)在设计模式中对观察者的描述具有双向性。

在观察者的描述中,一个具体的观察者可能对它的主题发出改变的信号。Subject 包含所有 ConcreteObserver 的列表,然后通知其列表。所有具体观察者,包括原动机,然后作出适当的反应。

监听器的常见实现似乎都对外部事件作出反应。

因此,我认为监听器是观察者的一种不太一般化的情况。

举个例子

如果您只是想知道使用什么名称,那么可能希望对简单的内容使用“侦听器”,对超出回调的任何复杂内容使用“观察器”。

我的意思是,从字面上看,一个人可以“观察”与许多方式,但一个人只能“听”外部噪音的东西(如回调,通知等)