在我看来,GOF中描述的Observer设计模式与Listeners在各种工具包中找到的完全相同。概念之间是否存在差异,或者听众和观察者是否真的相同。
(我不是在寻找任何特定的计算机语言实现,我只是想从设计的角度来理解差异(如果有的话)。是的,我知道有关SOF的类似问题有几个答案,但是他们根植于特定语言的具体问题 - 我正在寻找设计答案,而不是语言答案。)
答案 0 :(得分:52)
术语“监听器”是否指代观察者模式将取决于上下文。例如,Java Swing的“事件监听器”是Observer模式实现的一部分,而.Net“Trace Listeners”则不是。
框架作者为参与给定模式实现的组件分配不同的名称并不罕见,但官方模式名称通常在讨论模式本身时使用。
关于设计,给定模式的实现通常会受到所使用的语言和平台的影响。因此,给定框架中的Observer模式的特定实现(可能碰巧使用术语“侦听器”来描述ConcreteObserver的角色)可能与Design Patterns一书中描述的略有不同。
答案 1 :(得分:22)
Gamma等人对“设计模式中的观察者”的描述具有双重性质。人。 (GOF)。
在Observer的描述中,其中一个ConcreteObservers可能会发出对其主题的更改的信号。 Subject,其中包含所有ConcreteObservers的列表,然后通知其列表。然后,包括原动机在内的所有ConcreteObservers都会做出适当的反应。
Listeners的常见实现似乎都对来自外部的事件做出反应。
所以,我会说Listener是一个不太概括的Observer案例。
答案 2 :(得分:3)
监听器可能是观察者模式的实现。侦听器本质上是在等待事件发生在给定对象上,这是观察者所做的事情。
我知道你不是在语言特定的答案之后但是在摘要中很难谈论这些东西。因此,如果我要在.NET中对此进行研究,我将倾向于在.NET Reflector中打开一个包含侦听器的程序集,这将允许我反汇编程序集并根据设计模式检查其逻辑。