我会用一个例子来解释。我的GWT项目有一个公司模块,它允许用户添加,编辑,删除,选择和列出公司。看似多余的事件和事件处理程序
其中,添加,编辑和删除操作在CompanyList页面上返回用户。因此,有三个不同的事件 - CompanyAddedEvent, CompanyUpdatedEvent and CompanyDeletedEvent
,以及它们各自的事件处理程序 - 对我来说看起来有点矫枉过正,因为它们的功能绝对没有区别。
可以让一个事件管理这三个操作吗? 我想一个替代方法是使用CompanyListInvokedEvent
等事件。然而,我认为它不合适的地方是事件实际上不是被调用的列表,而是一个正在被添加/更新/删除的公司。
如果它只是一个单一的模块,我会完成任务与三个单独的事件。但其他10个这样的模块正面临着这种困境。它意味着10x3 = 30个事件类别以及30个相应的处理程序。这个数字足以让我重新考虑。 这将是一个很好的解决方案?
更新 -
@ ColinAlworth的回答让我意识到,我可以很容易地使用仿制药,而不是我笨的解决方案。以下代码表示一个事件EntityUpdatedEvent,每当实体更新时都会引发该事件。
事件处理程序类 -
public class EntityUpdatedEvent<T> extends GwtEvent<EntityUpdatedEventHandler<T>>{
private Type<EntityUpdatedEventHandler<T>> type;
private final String statusMessage;
public EntityUpdatedEvent(Type<EntityUpdatedEventHandler<T>> type, String statusMessage) {
this.statusMessage = statusMessage;
this.type = type;
}
public String getStatusMessage() {
return this.statusMessage;
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<EntityUpdatedEventHandler<T>> getAssociatedType() {
return this.type;
}
@Override
protected void dispatch(EntityUpdatedEventHandler<T> handler) {
handler.onEventRaised(this);
}
}
事件处理接口 -
public interface EntityUpdatedEventHandler<T> extends EventHandler {
void onEventRaised(EntityUpdatedEvent<T> event);
}
添加处理程序事件总线 -
eventBus.addHandler(CompanyEventHandlerTypes.CompanyUpdated, new EntityUpdatedEventHandler<Company>() {
@Override
public void onEventRaised(EntityUpdatedEvent<Company> event) {
History.newItem(CompanyToken.CompanyList.name());
Presenter presenter = new CompanyListPresenter(serviceBundle, eventBus, new CompanyListView(), event.getStatusMessage());
presenter.go(container);
}
});
同样,我有两个其他的添加和删除通用事件,从而消除了与事件相关的代码库的全部冗余。
对此解决方案有任何建议吗?
P.S. >This discussion提供有关此问题的更多信息。
啊啊...... +2为枚举的想法:) – 2013-03-23 19:15:58
@Baadshah是公平的,我不确定这是一个*好*的想法 - 但它是*一个*想法。 – 2013-03-23 20:47:45
是的,可能是我们通过使用EventType enum构建了30多个演示程序应用程序和10个处理程序。使用EventType enum.Did'nt发现任何困难,无论是性能和开发side.let有人在这里抓到我们:) – 2013-03-23 21:35:27