直接流量取决于传入的动态类型

时间:2009-12-26 18:54:54

标签: java event-handling

我有一个侦听器类,它在一个方法中接受GUI更改事件。

传入的事件对象具有GUI事件类型的超类,行为应该取决于传入变量的动态类型。

我想做很多方法,比如:

handleGUIEvent(EventChangedX event)
handleGUIEvent(EventChangedY event)

我正在使用单个事件侦听器并接收各种类型的对象,但每个行为应该是不同的。你会做什么?

我不想使用switch语句,因为这将无法维护。

4 个答案:

答案 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上的操作(我认为消息传递)