簡體   English   中英

有比處理一系列事件更好的方法嗎?

[英]Is there a better way than a sequence of if's to handle events?

我最近遇到了一些使用此模式通過硬編碼映射實現以處理事件的對象:

public void handleEvent(Event event)
{
    if(event.getCode() == SOME_STATIC_EVENT)
        doSomething(event);
    if(event.getCode() == ANOTHER_STATIC_EVENT)
        doSomethingElse(event);
}

其中doSomething函數作為同一類的方法實現。

希望爭取更寬松的耦合,您如何建議抽象出這種模式? 另外,將0..N函數映射到觸發事件的最佳方法是什么?

是的,基本上您想要做的是創建一個將事件類型映射到接口的數據結構。 這是一個簡單的實現為地圖的地圖。

EventHandlerInterface h;
// eventMap contains a mapping of event codes to
// implementations of EventHandlerInterface
h = eventMap.get(event.getCode());
if(h != null)
{
    h.handle(event);
}

這使您能夠有效地處理大量事件並將事件動態添加,刪除和重新映射到不同的處理程序。

最近有一則SOF帖子,內容相似且非常接近,因此我在這里的回答可以很好地回答您的問題。

您可以創建自己的界面,而不是運行它:

public abstract interface EventHandler
{
    public void run(Event event);
}

您可以先使代碼更簡潔些。 使用局部變量取出重復的event.getCode() 切換到枚舉,以便可以使用switch

如果存在重復模式,則可以像AWT一樣解碼為多方法回調接口。

我建議偶數的注冊變得更加具體。 為每種事件類型注冊一個不同的回調。 甚至從事件中刪除事件代碼,甚至刪除事件。 在工作表下,您可以保留事件代碼以映射到處理程序,但這應該是不透明的。 這種方法的缺點是當前匿名內部類(JDK6)非常冗長,並且類處理效率低下(加載時間和perm gen足跡)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM