2010-03-30 64 views
1

最近,我跑过实现来处理事件使用此模式的硬编码映射几个对象:有没有更好的方法来处理事件的一系列if?

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

其中DoSomething的实现是同一个类的方法。

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

回答

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

最近有一个SOF文章是相似和足够接近,我的回应here可以很好地回答你的问题。

,而不是一个可运行的,你会作出自己的界面:

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

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

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

我建议even的注册变得更具体。为每个事件类型注册一个不同的回调。即使将事件代码从事件中移出,并且可能会移除该事件。在工作表下面,你可以保存一个映射到处理程序的事件代码,但这应该是不透明的。这种方法的缺点是匿名内部类目前(JDK6)高度冗长,并且类处理效率低下(加载时间和perm gen占用空间)。

相关问题