我最近遇到了几个实现的对象,使用这种模式处理带有硬编码映射的事件:
public void handleEvent(Event event)
{
if(event.getCode() == SOME_STATIC_EVENT)
doSomething(event);
if(event.getCode() == ANOTHER_STATIC_EVENT)
doSomethingElse(event);
}
其中doSomething函数是作为同一类的方法实现的。
为了争取更宽松的耦合,你会如何建议抽象出这种模式?另外,将0..N函数映射到触发事件的最佳方法是什么?
答案 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足迹)。