【问题标题】:Alternative to Java's Observable class? [closed]替代 Java 的 Observable 类? [关闭]
【发布时间】:2012-04-18 22:17:42
【问题描述】:

我是从 C# 世界来到 Java 的,在 C# 世界中,观察者模式被实现为带有 event 关键字的一流语言结构。

我看到 Java 从早期就有 Observable 类,但它显然存在实现问题并且似乎没有被广泛使用。到目前为止,我只是在我的 Java 代码中滚动我自己的观察者模式实现,但我总是忍不住认为必须有更好的替代方法来始终输出这个样板代码。 Swing 中有 Listener 类,但它们似乎不适用于非 Swing 代码。

对于这个非常常见的问题,推荐的解决方案是什么?第三方库对我来说没问题。

【问题讨论】:

  • 为什么监听器类不适合非 Swing 代码?
  • 似乎所有 EventListener 派生接口和类都在 Swing 和 AWT 包中。由于它们位于负责 UI 的包中,因此将它们用于非 UI 对我来说似乎是一种难闻的气味。 EventListener 是否在这些 UI 上下文之外使用?
  • 谁会阻止您派生自己的侦听器类? EventListenerEventObject 都在 java.util 中,它们不以任何方式绑定到 AWT 或 Swing。
  • EventListener 接口相当没用。它没有声明任何方法。

标签: java events observer-pattern observable


【解决方案1】:

我建议查看reactive programming。 Java 只有一种我知道的实现:reactive4java

【讨论】:

  • 很好的建议,谢谢。我最近开始在我的 C# 开发中使用 Reactive Extensions,它令人印象深刻。
【解决方案2】:

通常,观察者模式在需要时使用临时解决方案来实现。当涉及到行为模式时,它是最简单的一种:两种方法来控制“观察者”列表,另一种方法在发生有趣的事情时通知观察者。

观察者模式往往很少出现在某些领域之外,当它出现时,它往往过于特定于应用程序领域,因此通用解决方案没有什么价值。您可以看到 java.util.Observable 类的问题:如果您从 Observable 继承,您必须接受可能传递给您的所有可能类型的“观察者”,这对您的应用程序可能没有意义:

  • 如果您的对象可以产生两种不同类型的事件,因此需要两个不同的观察者列表,该怎么办?
  • 如果观察者可能会根据事件影响您的对象怎么办,例如否决变更?

也就是说,EventBus from Google Guava 似乎在通过采用完全不同的方法简化事件生成和处理方面做得很好。

之前的其他techniques based on annotations have been discussed on SO

【讨论】:

  • 感谢您的回答。我不确定您关于通用观察者解决方案价值不大的说法,尽管我可以看到该论点适用于 Java 的 Observer 实现。再次提到 C#,Observer 是它的 event 构造中的一等公民,该构造在 .NET 中大量使用。我认为通用观察者只需要正确实现,也许确实需要一种语言结构来实现它。
  • 是的,需要一种语言结构。例如,如果您有N 不同类型的事件,则必须使用N 管理事件侦听器的方法集来扩充该类。但是 Java 语言库不能在使用它的类中添加任意数量的方法。
  • 我们在使用 util.Obserable 或原始 GoF 方法时遇到的主要问题是,在大型应用程序中,线程、死锁和性能变得疯狂。我们用偶数总线方法打开了我们的应用程序
【解决方案3】:

This article 展示了使用 Spring Framework 的模式的一个很好的实现。你仍然需要定义你的 Subject 和 Observer 接口(和实现),但是 Spring 通过 XML 配置处理 Observer 向 Subjects 的注册。

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2011-01-24
    • 2010-11-26
    • 2011-08-18
    • 2014-08-26
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多