Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 直接流取决于传入的动态类型_Java_Event Handling - Fatal编程技术网

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

Java 直接流取决于传入的动态类型,java,event-handling,Java,Event Handling,我有一个侦听器类,它在一个方法中接受GUI更改事件 传入事件对象具有GUI事件类型的超类,其行为应取决于传入变量的动态类型 我想做很多方法,比如: handleGUIEvent(EventChangedX event) handleGUIEvent(EventChangedY event) 我使用单个事件侦听器并接收各种类型的对象,但每个对象的行为应该不同。你会怎么做 我不想使用switch语句,因为这将变得不可维护。您可以在GUI事件的各个子类中了解该做什么。然而,这将在标准模型-视图-控制

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

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

我想做很多方法,比如:

handleGUIEvent(EventChangedX event)
handleGUIEvent(EventChangedY event)
我使用单个事件侦听器并接收各种类型的对象,但每个对象的行为应该不同。你会怎么做


我不想使用switch语句,因为这将变得不可维护。

您可以在GUI事件的各个子类中了解该做什么。然而,这将在标准模型-视图-控制器范例中分散控制器组件。

GUIEvent应提供该类型的抽象方法

delegateEvent(EventListener el)
然后,每个子类都应该实现这个方法,并在EventListener上调用特定的方法。这样一来,GUIEvent的子类可以确定在EventListener上调用什么,它们之间的两个对象类可以确定执行什么操作。这被称为。它避免了switch语句等

尽管我将其描述为调用GUIEvent.delegateEvent并调用EventListener的EventListener,但没有理由不存在第三个类,比如EventReceiver。因此,GUIEvent上的抽象方法如下所示:

delegateEvent(EventReceiver er)

EventReceiver将实现GUI事件调用的适当方法。

有几个选项:

创建处理程序类,并在映射中注册每个处理程序,将事件类的类型作为键。通过这种方式,您可以在映射中执行单个查找以获取处理程序。 创建一个名为handle+它所处理事件类型的方法,例如handleMouseClick。使用反射查找正确的处理程序。 第一种方法可能更简单,所需的try-catch更少

为此创建一个帮助器类。在helper类中,还可以添加一个查找,该查找使用事件类上的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 ();
}

以下是我迄今为止所做的工作,它似乎工作得很好

我在一个大型GUI中集成了许多GUI组件,但是这些组件及其事件应该可以在前端之外使用

大型GUI使用observer模式,并为其分配了一个GUI控制器。GUI控制器接口对每个事件都有一个handleEventName方法

handleEventX(RangeChange changed);
handleEventY(AlgorithmChange alg);

子组件使用传播到大型GUI的实际事件,大型GUI可以通过switch语句自己处理事件,或将事件传递给GUI控制器,GUI控制器可能反过来调用GUI消息的操作传递我认为这不起作用:事件发送者不知道处理程序,所以他们不能实例化正确的子类。此外,这会将每个事件类型限制为一个处理程序。事件背后的思想是,它们不需要知道任何有关处理程序的信息。因此,这种模式只适用于最基本的UI,我一点也看不出来。上述方法通过将行为放入事件中以及它们与其他对象的协作来实现多态性。在我看来,你对这些事件做出了一个未声明的假设。这种双重分派也被称为访问者模式GoF,但当我们希望以多态方式处理的类型层次结构是稳定的,并且你不必添加更多的类型时,它就起作用了。如果您添加了一个类型,您必须在侦听器中添加一个visit方法,然后:lotoflisteners->problem。