Java的Observable类的替代品?

时间:2012-04-18 22:17:42

标签: java events observer-pattern observable

我从C#世界来到Java,其中Observer模式被实现为具有event关键字的一流语言结构。

我发现自早期以来Java已经拥有Observable类,但它显然存在实现问题,并且似乎没有被广泛使用。到目前为止,我刚刚在我的Java代码中滚动了我自己的Observer模式实现,但我总是忍不住认为必须有一个更好的替代方案来总是输出这个样板代码。 Swing中有Listener类,但它们似乎不适合非Swing代码。

对于这个常见问题,推荐的解决方案是什么?第三方图书馆对我没问题。

3 个答案:

答案 0 :(得分:17)

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

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

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

尽管如此,EventBus from Google Guava似乎在通过采用完全不同的方法简化事件生成和处理方面做得非常好。

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

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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