我會用一個例子來解釋。我的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