6

我正在 GWT 中创建一个类似 MVP 的应用程序。

  • 有多个面板,每个面板始终可见。
  • 每个面板都有一个 Presenter,并且有一个 AppController 位于所有 Presenter 之上。
  • 有一些应用程序级别的事件发生在一个 Presenter 中,但对其他 Presenter 有影响。
  • 为此建议的架构似乎涉及事件总线。但是,我不确定我是否看到了与更简单的东西相比的优势。
  • 特别是,简单地允许 AppController(并且只有 AppController)订阅来自任何 Presenter 的事件不是更干净吗?AppController 然后可以告诉每个 Presenter 做什么,给定事件。
  • “事件总线”似乎是一个准全局变量。但是,如果您可以使用更精确定义的方法(即 AppController 在每个 Presenter 上调用的方法)来完成同样的事情,那不是更可取吗?

更准确地说,为什么要引入事件总线,而不是简单地让事件“冒泡”到适当的决策级别?对我来说,这似乎是 MVP 概念最直接的扩展,它不需要事件总线的新想法。我不明白引入事件总线是为了解决什么问题。

4

2 回答 2

8

事件总线的优点是代码分离。

您可以将自定义事件发送到总线,而不再需要关心您的事件。每个演示者都只订阅它真正需要知道的事件。这将导致代码更简洁,因为您不必创建一个必须知道所有演示者才能将事件委托给它们的调度程序。

在我看来,eventbus 是一个非常好的东西,它可以让代码简洁易懂。

于 2013-02-12T07:52:19.407 回答
3

您提出的方法很好,但有一个很大的缺点:当您的应用程序增长时,它需要意大利面条式代码。

此演示文稿是关于 Android 的,但 GWT 的论点也成立。

另请参阅Google I/O 2009 上的这个著名演示文稿,其中明确讨论了使用事件总线来对抗意大利面条代码(如果您还没有的话,请务必观看)。

最后,这篇博文讨论了 JS 中的观察者中介者模式:在 GWT 中,观察者模式由事件处理程序实现,而中介者模式由事件总线实现。这是tl;dr:« 在组件内部“本地”使用观察者,在组件之间“远程”使用调解器。»

于 2013-02-12T09:26:02.307 回答