我在所有處理由事件總線類觸發的事件的觀察者類中都有類似於此的代碼。 正如您所看到的,有很多instanceof檢查來選擇適當處理事件所需的操作路徑,並且我想知道是否可以更乾淨地完成此操作,從而消除了instanceof測試?乾淨地處理事件
@Override
public void handleEvent(Event event) {
if (event instanceof DownloadStartedEvent) {
DownloadStartedEvent dsEvent = (DownloadStartedEvent)event;
dsEvent.getDownloadCandidateItem().setState(new BusyDownloadingState());
} else if (event instanceof DownloadCompletedEvent) {
DownloadCompletedEvent dcEvent = (DownloadCompletedEvent)event;
dcEvent.getDownloadCandidateItem().setState(new FinishedDownloadingState());
DownloadCandidate downloadCandidate = dcEvent.getDownloadCandidateItem(). getDownloadCandidate();
if (downloadCandidate.isComplete()) {
// start extracting
}
} else if (event instanceof DownloadFailedEvent) {
DownloadFailedEvent dfEvent = (DownloadFailedEvent)event;
dfEvent.getDownloadCandidateItem().setState(new FailedDownloadingState());
}
}
這是一個乾淨的,面向對象的方式來做到這一點。其他方式將使用切換瀑布事件的參數..你爲什麼認爲這不明確? – Jack 2010-04-18 15:44:24
@Jack如果您希望稍後添加更多活動,那麼這是一個維護噩夢:總會有一個您忘記檢查的活動。 – jqno 2010-04-18 15:53:00
如果你有很多事件,那麼它將會成爲維護噩夢,直到你不給事件祖先類中的常見行爲,而不是將它們全部分開。實際上,當number_events> a_considerable_amount時,你將發誓在任何情況下:/ – Jack 2010-04-18 15:56:13