有没有比处理事件的if序列更好的方法?

时间:2010-03-30 02:44:21

标签: java mapping abstraction

我最近遇到了几个实现的对象,使用这种模式处理带有硬编码映射的事件:

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

其中doSomething函数是作为同一类的方法实现的。

为了争取更宽松的耦合,你会如何建议抽象出这种模式?另外,将0..N函数映射到触发事件的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

是的,基本上你要做的是创建一个将事件类型映射到接口的数据结构。这是一个简单的地图实现。

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

这使您能够有效地处理大量事件,并动态地向不同的处理程序添加,删除和重新映射事件。

答案 1 :(得分:1)

最近有一篇SOF帖子类似且相近,我的回复here可以很好地回答你的问题。

您可以创建自己的界面,而不是runnable:

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

答案 2 :(得分:0)

您可以从使代码更清洁一开始。使用局部变量取出重复的event.getCode()。切换到枚举,以便您可以使用switch

如果存在重复模式,您可以解码为多方法回调接口,就像AWT一样。

我建议将注册更加具体。为每种事件类型注册不同的回调。即使将事件代码从事件中删除,也可能删除事件。在工作表下,您可以保留映射到处理程序的事件代码,但这应该是不透明的。这种方法的缺点是匿名内部类目前(JDK6)非常冗长,类处理效率低(加载时间和perm gen足迹)。