我使用EventBus了解了GWT中这个很酷的事件处理,到目前为止我真的很喜欢它。但是我什么时候应该使用它并没有真正掌握这个概念。每时每刻? 我可以过度使用吗?我应该将它用于与事件相关的所有事情吗? (比如在MVP中的视图和演示者层之间进行通信?或者我可以将它与onMouseMove事件一起使用吗?它的重量级是多少?)
所以在一个问题中:EventBus在GWT中的作用究竟是什么?
答案 0 :(得分:5)
您可能已经看过此Google I / O演示文稿:Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App。
它涵盖了使大型GWT项目更易于管理的简洁技术,例如使用命令模式进行RPC调用,MVP模式,依赖注入以及使用EventBus模式解耦组件。现在有几个GWT框架实现了这些模式,( gwt-dispatch 用于命令模式, gwt-presenter 和 gwt-platform 用于MVP,对于DI来说, GIN& Guice ,但我喜欢EventBus概念的是它是核心GWT框架(HandlerManager
)的一部分,所以我不必添加额外的依赖项小型GWT项目。
我认为EventBus概念与 Observer 设计模式有关,因为您正在解耦负责从Presenter组件获取用户输入的View组件,这些组件需要通知这些操作。关键是你的ListBox thingy不必知道对其状态变化感兴趣的所有组件,它只是向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()
方法,而不是触发事件。 (或者更糟糕的是:调用所有的refresh() - es,DateRangePicker对象的子组件的onSomethingChange()方法。)
答案 1 :(得分:3)
我认为使用全局EventBus
进行单个小部件MVP部件之间的内部通信有点过度使用。这将使您的小部件依赖于事件总线。 (如果事件总线不在核心GWT中,那将更加令人无法接受。)我认为eventbus是应用程序不同部分的不同小部件之间的通信媒介。
答案 2 :(得分:2)
在视图和演示者之间使用它是没有用的,而不是让演示者直接调用视图方法。
我相信当组件不相互引用时,EventBus会很好,例如2个不同屏幕的演示者。