【问题标题】:EventBus role in GWTGWT 中的 EventBus 角色
【发布时间】:2011-11-30 13:08:38
【问题描述】:

我在 GWT 中使用 EventBus 阅读了这个很酷的事件处理,到目前为止我真的很喜欢它。但我并没有真正理解什么时候应该使用它。每时每刻? 我可以过度使用它吗?我应该将它用于与事件相关的所有事情吗? (就像 MVP 中的视图层和演示者层之间的通信?或者我可以将它与 onMouseMove 事件一起使用吗?它有多重量级?)

那么问题来了:EventBus 在 GWT 中究竟扮演什么角色?

【问题讨论】:

  • 一切都可以被过度使用:-)

标签: gwt event-bus


【解决方案1】:

您可能已经看过这个 Google I/O 演示文稿:Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App

它涵盖了使大型 GWT 项目更易于管理的巧妙技术,例如使用 RPC 调用的命令模式、MVP 模式、依赖注入以及使用 EventBus 模式解耦组件。现在有几个 GWT 框架实现了这些模式,(gwt-dispatch 用于命令模式,gwt-presentergwt-platform 用于 MVP, GIN & Guice for DI) 但我喜欢 EventBus 概念的一点是它是核心 GWT 框架 (HandlerManager) 的一部分,因此我不必为更小的 GWT 添加额外的依赖项项目。

我认为 EventBus 概念与 Observer 设计模式相关,因为您将负责获取用户输入的 View 组件与需要通知这些操作的 Presenter 组件分离。关键是您的 ListBox 不必知道对其状态更改感兴趣的所有组件,它只是向 EventBus 触发一个事件,感兴趣的组件将接收该事件并按照他们的意愿行事。

我不认为你总是必须通过 HandlerManager 实例来做事。假设您有一个自定义的 DateRangePicker 小部件,它允许用户选择自定义日期范围。每当挑选日期范围时,窗口小部件就可以在其onSomethingChanged()方法中执行类似的东西:

NativeEvent event = Document.get().createChangeEvent();
DomEvent.fireNativeEvent(event, this);

然后,对日期范围选择更改感兴趣的组件只需将处理程序回调注册到 DateRangePicker 小部件实例。

dateRangePicker.addDomHandler(new ChangeHandler(){
    @Override
    public void onChange(ChangeEvent event) {
        refresh();
    }
}, ChangeEvent.getType());

我认为这是一个很好的松耦合设计,它不使用HandlerManager 实例。

一个糟糕的设计是在 DateRangePicker 的 onSomethingChange() 方法中调用所有感兴趣的组件的 refresh() 方法,而不是触发事件。 (或者更糟糕的是:在 DateRangePicker 对象的子组件的 onSomethingChange() 方法中调用所有的 refresh()-es。)

【讨论】:

    【解决方案2】:

    我认为将全局 EventBus 用于单个小部件的 MVP 部件之间的内部通信有点过度使用。这将使您的小部件依赖于事件总线。 (如果事件总线不在核心 GWT 中,那显然是不可接受的。)我认为事件总线是应用程序不同部分的不同小部件之间的通信媒介。

    【讨论】:

      【解决方案3】:

      在视图和演示者之间使用它是没有用的,而不是让演示者直接调用视图方法。

      我相信当组件不相互引用时,EventBus 是好的,例如 2 个不同屏幕的演示者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多