我会用一个例子来解释。我的 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);
}
});
同样,我还有另外两个已添加和已删除的通用事件,从而消除了与事件相关的代码库中的全部冗余。
对此解决方案有什么建议吗?
PS >这个讨论提供了关于这个问题的更多见解。