事件总线在GWT中的作用

事件总线在GWT中的作用,gwt,event-bus,Gwt,Event Bus,我读到了关于GWT中使用EventBus处理事件的文章,到目前为止我非常喜欢它。但是我没有真正理解什么时候应该使用它。总是 我可以过度使用它吗?我应该在所有与事件相关的事情上使用它吗? (比如MVP中视图和演示者层之间的通信?或者我可以将其用于onMouseMove事件吗?它有多重?) 所以有一个问题:EventBus在GWT中到底扮演什么角色?在view和presenter之间使用它,而不是让presenter直接调用view方法,这是非常无用的 我相信当组件之间没有相互引用时,EventBu

我读到了关于GWT中使用EventBus处理事件的文章,到目前为止我非常喜欢它。但是我没有真正理解什么时候应该使用它。总是 我可以过度使用它吗?我应该在所有与事件相关的事情上使用它吗? (比如MVP中视图和演示者层之间的通信?或者我可以将其用于onMouseMove事件吗?它有多重?)


所以有一个问题:EventBus在GWT中到底扮演什么角色?

在view和presenter之间使用它,而不是让presenter直接调用view方法,这是非常无用的


我相信当组件之间没有相互引用时,EventBus是很好的,例如,两个不同屏幕的演示者。

您可能已经看到了这个Google I/O演示:

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

我认为EventBus的概念与观测者的设计模式相关,因为你将负责获取用户输入的视图组件与需要通知这些操作的演示者组件分离。关键是你的ListBox不必知道一个如果您对其状态更改感兴趣,它只会向EventBus触发一个事件,感兴趣的组件将接收该事件并按照自己的意愿进行操作

不过,我认为您不必总是通过HandlerManager实例进行操作。假设您有一个自定义的
DateRangePicker
小部件,它允许用户选择自定义日期范围。每当选择日期范围时,小部件都可以在其
onSomethingChanged()方法中执行类似操作:

NativeEvent event = Document.get().createChangeEvent();
DomEvent.fireNativeEvent(event, this);
然后,对日期范围选择更改感兴趣的组件可以将hander回调注册到DateRangePicker小部件实例

dateRangePicker.addDomHandler(new ChangeHandler(){
    @Override
    public void onChange(ChangeEvent event) {
        refresh();
    }
}, ChangeEvent.getType());
我认为这是一个很好的松耦合设计,它没有使用
HandlerManager
实例


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

我认为使用全局
EventBus
在单个小部件的MVP部件之间进行内部通信有点过度使用。这将使您的小部件依赖于EventBus(如果EventBus不在核心GWT中,这将更明显地不可接受)我认为EnvestBUS是应用程序不同部件的不同窗口之间的通信媒介。

一切都可能被过度使用: