【问题标题】:Observer Design Pattern vs "Listeners"观察者设计模式与“听众”
【发布时间】:2011-03-22 11:29:40
【问题描述】:

在我看来,GOF 中描述的 Observer 设计模式实际上与各种工具包中的 Listeners 相同。概念之间是否存在差异,或者 Listeners 和 Observers 真的是一回事。

(我不是在寻找任何特定的计算机语言实现,我只是想从设计的角度了解差异(如果有的话)。是的,我知道 SOF 上类似问题有几个答案,但他们'植根于关于特定语言的特定问题——我正在寻找设计答案,而不是语言答案。)

【问题讨论】:

  • 前一个代码监视另一个代码的运动,而后一个代码监听另一个代码是否有任何噪音。
  • GOF 代表什么?

标签: design-patterns language-agnostic listener observer-pattern


【解决方案1】:

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

我知道您不是在寻找特定语言的答案,但是抽象地谈论这些东西有点困难。因此,如果我要在 .NET 中对此进行调查,我会倾向于在 .NET Reflector 中打开一个包含侦听器的程序集,这将允许我反汇编该程序集并根据设计模式检查其逻辑。

【讨论】:

  • “侦听器本质上是在等待给定对象上发生的事件,这是观察者所做的” 不完全是,根据 DP 书籍,观察者不会等待任何类型的事件,但对象状态的变化,然后观察者可以查询(拉)。也许“State Observer”是该模式的更准确名称。
【解决方案2】:

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

在他们对 Observer 的描述中,其中一个 ConcreteObserver 可能表示其 Subject 发生了变化。持有所有 ConcreteObservers 列表的 Subject 然后通知它的列表。所有的 ConcreteObservers,包括原动机,都会做出适当的反应。

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

所以,我会说 Listener 是 Observer 的一个不太通用的情况。

【讨论】:

  • 在 GoF 观察者模式中,主体通知观察者其自身状态的变化。所以“State Observer”实际上是该模式的一个更具描述性的名称。正如您所描述的,它还允许观察者对主题采取行动。因此,尽管 Listeners 在这个意义上看起来不那么笼统,但我认为他们在对任何类型的事件做出反应的意义上也更笼统,而不仅仅是他们感兴趣的主题状态变化。
【解决方案3】:

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

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

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

【讨论】:

  • 您提到.NET“跟踪侦听器”不是观察者模式的一部分。它们是什么?
  • 我不确定您是否在问他们的目的是什么或他们属于哪种模式。 .Net 跟踪侦听器只是用于写入日志消息流(例如写入控制台、写入文件、写入事件日志等)的可插入接收器。就模式而言,虽然整体 .Net 跟踪功能采用了多种模式(插件, Iterator),循环遍历所有符合相同接口的对象集合实际上只是平面简多态性。 TraceListeners 本身并不关心被观察对象的状态变化,所以这不是观察者模式。
  • 谢谢你的解释,正是我需要的
  • *plain jane ...呃,我讨厌在你无法编辑的地方出现拼写错误
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 2011-11-25
  • 2011-09-25
  • 2010-12-31
  • 2020-12-28
  • 1970-01-01
  • 2012-03-02
  • 2010-09-23
相关资源
最近更新 更多