我有一个侦听器类,它在一个方法中接受GUI更改事件。
传入的事件对象具有GUI事件类型的超类,行为应该取决于传入变量的动态类型。
我想做很多方法,比如:
handleGUIEvent(EventChangedX event)
handleGUIEvent(EventChangedY event)
我正在使用单个事件侦听器并接收各种类型的对象,但每个行为应该是不同的。你会做什么?
我不想使用switch语句,因为这将无法维护。
答案 0 :(得分:0)
您可以在GUI事件的各个子类中提供有关操作的知识。然而,这将分散标准模型 - 视图 - 控制器范例中的“控制器”组件。
答案 1 :(得分:0)
GUIEvent
应该提供类型
delegateEvent(EventListener el)
然后,每个子类应实现此方法,并在EventListener
上回调特定方法。这样,GUIEvent
的子类可以确定在EventListener
上调用什么,并且它们之间的两个对象类可以确定要执行的操作。这称为 double-dispatch 。它避免了switch
语句等。
虽然我已经把它作为EventListener调用GUIEvent.delegateEvent并在EventListener上调用 back ,但是没有理由不能有第三个类(比如EventReceiver
)。所以GUIEvent
上的抽象方法看起来像:
delegateEvent(EventReceiver er)
和EventReceiver
将实现GUIEvent
调用的适当方法。
答案 2 :(得分:0)
有几种选择:
handle
的方法+它处理的事件的类型(例如,handleMouseClick
)。使用反射来找到正确的处理程序。第一种方法可能更简单(并且需要更少try-catch
)。
为此创建一个帮助程序类。在帮助器类中,您还可以添加在事件类上使用getSuperClass()
的查找来处理事件的继承。
Map<Class<?>, IHandler> map;
public IHandler handler (Event event)
{
Class<?> current = event.getClass ();
while (true)
{
handler = map.get (current);
if (handler != null)
return handler;
if (current == null)
break;
current = current.getSuperclass ();
}
return new DummyHandler ();
}
答案 3 :(得分:0)
这是我到目前为止所做的事情,似乎运作良好。
我有一些GUI组件包含在一个大型GUI中,但这些组件(及其事件)应该可以在这个前端之外使用。
大型GUI使用观察者模式并为其分配了GUIController。 GUIController接口为每个事件都有一个handleEventName方法。
handleEventX(RangeChange changed);
handleEventY(AlgorithmChange alg);
子组件使用传播到大型GUI的实际事件,后者可以通过switch语句自己处理事件,或者将它们传递给GUIController,后者可以反过来调用GUI上的操作(我认为消息传递)