我在使用EventBus阅读GWT中的这个很酷的事件处理,到目前为止,我非常喜欢它.但是我什么时候应该使用它并没有真正掌握这个概念.每时每刻?我可以过度使用吗?我应该将它用于与事件相关的所有事情吗?(比如在MVP中的视图和演示者层之间进行通信?或者我可以将它与onMouseMove事件一起使用吗?它的重量级是多少?)
所以在一个问题中:EventBus在GWT中的作用究竟是什么?
您可能已经看过这个Google I/O演示文稿:Google Web Toolkit架构:构建您的GWT应用程序的最佳实践.
它涵盖了使大型GWT项目更易于管理的简洁技术,例如使用命令模式进行RPC调用,MVP模式,依赖注入以及使用EventBus模式解耦组件.现在有几个实现这些模式的GWT框架,(用于命令模式的gwt-dispatch,用于MVP的gwt-presenter和gwt-platform,用于DI的gwt- Guice)但我喜欢的EventBus概念是它的一部分核心GWT框架(HandlerManager),所以我不必为较小的GWT项目添加额外的依赖项.
我认为EventBus概念与Observer设计模式有关,因为您正在解耦负责从Presenter组件获取用户输入的View组件,这些组件需要通知这些操作.关键是你的ListBox thingy不必知道对其状态变化感兴趣的所有组件,它只是向EventBus发出一个事件,感兴趣的组件将接收该事件并按照他们想要的方式行动.
我不认为你总是要通过HandlerManager实例做事.假设您有一个自定义DateRangePicker小部件,可让用户选择自定义日期范围.每当选择一个日期范围时,小部件可以在其onSomethingChanged()方法中执行以下操作:
NativeEvent event = Document.get().createChangeEvent();
DomEvent.fireNativeEvent(event, this);
Run Code Online (Sandbox Code Playgroud)
然后,对日期范围选择更改感兴趣的组件可以将注册回调注册到DateRangePicker小部件实例.
dateRangePicker.addDomHandler(new ChangeHandler(){
@Override
public void onChange(ChangeEvent event) {
refresh();
}
}, ChangeEvent.getType());
Run Code Online (Sandbox Code Playgroud)
我认为这是一个很好的松散耦合设计,它不使用HandlerManager实例.
糟糕的设计是refresh()在DateRangePicker的onSomethingChange()方法中调用所有感兴趣的组件的方法,而不是触发事件.(或者更糟糕的是:调用所有的refresh() - es,DateRangePicker对象的子组件的onSomethingChange()方法.)
我认为使用全局EventBus来进行单个小部件的 MVP 部分之间的内部通信有点过度使用。这将使您的小部件依赖于事件总线。(如果事件总线不在核心 GWT 中,那显然是不可接受的。)我认为事件总线是应用程序不同部分的不同小部件之间的通信媒介。
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |