观察者设计模式与“听众”


136

在我看来,GOF中描述的Observer设计模式与各种工具包中的Listeners确实是同一回事。概念之间是否有区别,或者侦听器和观察者确实是同一回事。

(我并不是在寻找任何特定的计算机语言实现,我只是想从设计的角度理解差异(如果有的话)。是的,我知道SOF中类似问题的答案有几个,但它们都是基于问题的有关特定语言的特定问题-我在寻找设计答案,而不是语言答案。)


19
在前者中,一个代码监视另一个代码的运动,而在后者中,一个代码侦听另一个代码是否有噪音。
nate c

2
GOF代表什么?
dekaru

Answers:


60

术语“侦听器”是否涉及观察者模式将取决于上下文。例如,Java Swing的“事件监听器”是观察者模式实现的一部分,而.Net“跟踪监听器”则不是。

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

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


26

Gamma等人在“设计模式”中对“观察者”的描述具有两种性质。等 (GoF)。

在Observer的描述中,其中一个ConcreteObserver可能表示已更改其Subject。主题,其中包含所有ConcreteObserver的列表,然后通知其列表。然后,所有的混凝土观察者,包括原动机,都会做出适当的反应。

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

因此,我想说的是,侦听器是观察员的一般情况。


4

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

我知道您并没有针对特定语言的答案,但是很难抽象地谈论这些内容。因此,如果我要在.NET中进行研究,则倾向于在.NET Reflector中打开一个包含侦听器的程序集,这将使我可以反汇编该程序集并根据设计模式检查其逻辑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.