您可能已经看过这个 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, 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。)