目前,我正在使用Scala(和JavaFX)的EventBus/PubSub架构/模式来实现一个简单的笔记整理应用程序(有点像一个带有一些思维导图功能的Evernote客户端),我必须说,我真的很喜欢EventBus而不是观察者模式。
以下是一些EventBus库:
https://code.google.com/p/guava-libraries/wiki/EventBusExplained
http://eventbus.org(目前似乎已经失效),这是我在我的实现中使用的一个。
http://greenrobot.github.io/EventBus/
这里是EventBus库的比较: http://codeblock.engio.net/37/
EventBus与发布-订阅模式有关。
但是!
最近,我参加了Coursera的响应式课程,开始想知道在单线程应用程序中是否使用RXJava代替EventBus会使事件处理代码更加简单?
我想问一下那些使用过两种技术(某种类型的事件总线库和某种形式的响应式扩展(RX))进行编程的人的经验:如果没有使用多个线程,使用RX比事件总线架构更容易解决事件处理复杂性吗?
我正在询问这个问题,因为我在Coursera上的响应式讲座中听说RX比使用观察者模式(即没有“回调地狱”)产生更干净的代码,但是我没有找到事件总线架构与RXJava之间的任何比较。所以很明显,事件总线和RXJava都比观察者模式更好,但是在单线程应用程序方面,在代码清晰性和可维护性方面,哪个更好?如果我理解正确,RXJava的主要卖点是如果存在阻塞操作(例如等待服务器响应),它可以用于生成响应式应用程序。
但是我根本不关心异步性,我只关心在单线程应用程序中保持代码清洁,松散并且易于推理。
在这种情况下,仍然最好使用RXJava而不是EventBus吗?
我认为EventBus会是一个更简单、更清晰的解决方案,我不明白为什么在单线程应用程序中,我应该使用RXJava而不是一个简单的EventBus架构。
但是我可能是错的!
如果我错了,请纠正我,并解释为什么在没有阻塞操作的情况下,在单线程应用程序中使用RXJava比简单的EventBus更好。
Observable
类(实际上,ObservableValue
更接近于RX的observable)。我目前正在研究在两者之间创建适配器。如果这是可能的,你可以简单地使用scalafx的bind
指令,这非常好且声明性强! - Lucianoa.events().subscribe(b::handle)
比在某个地方注册eventBus.register(b)
和在另一个地方发布eventBus.post(evt)
更加明确。此外,生产者的API没有说明它发布到事件总线的事件类型。另一方面,如果您有一个组件具有返回EventStream<E>
和另一个返回EventStream<F>
的方法,则清楚该组件生成类型为E
和类型为F
的事件。 - Tomas Mikula