通过GUI控制工厂有效地将数据和表示连接在一起?

时间:2012-06-01 14:27:50

标签: java user-interface javafx-2 factory-pattern data-representation

假设我有一个班级StaticVehicleInformation,其中包含有关车辆的“静态”信息,例如它的类型,序列号或颜色。

现在我有一个跟踪应用程序来跟踪驾驶车辆并在地图上显示它们。在这种情况下,StaticVehicleInformation包含在DynamicVehicleEntry<? extends StaticVehicleInformation>中,基本上会添加“动态”信息,例如currentPosition,speed或currentDriver。同时它有一个方法<T extends StaticVehicleInformation> <T> getStaticVehicleInformation()来返回包装的静态信息。

在我的地图中或基本上在显示不同移动车辆的任何视图中,因此主要处理List<DynamicVehicleEntry <? extends StaticVehicleInformation>,我需要区分我正在处理的实际类型的车辆以显示不同的图标等等。因此,通过具体DynamicVehicleEntry类(DynamicCarEntry extends DynamicVehicleEntry <StaticCarInformation>DynamicMotorcycleEntry extends DynamicVehicleEntry <StaticMotorcycleInformation>,...),我得到了不同类型的实时跟踪车辆,具有不同的静态和 - 如果需要 - 特定的“动态”属性(在DynamicVehicleEntry)的子类中。

由于我的目标是将数据与UI分开,因此我构建了一个工厂,根据应显示的DynamicVehicleEntry类型返回不同的UI元素:

// .... Factory....
public static Node createNewControlFromType(DynamicVehicleEntry <? extends StaticVehicleInformation> entry) {
    // from specific to general
    if (entry instanceof DynamicCarEntry) {
        return new CarControl(entry);
    } else if (entry instanceof DynamicMotorcycleEntry) {
        return new MotorcycleControl(entry);
    } else {
        // no concrete UI-Method found, so return a generic Control showing a dummy-icon
        // and only the most generic information common to every DynamicVehicleEntry and the wrapped StaticVehicleInformation
        return new GenericControl(entry);
    }
}

instanceOf闻起来,我认为仿制品的类型擦除也可能会打破我的脖子。假设我无法修改Static...InformationStatic...Information类,我应该如何解决这个问题?

提前致谢。

更新

我已经对它进行了一些广泛的搜索,并没有找到更好的解决方案,特别是如果一个人无法修改现有的类,因为访问者模式需要它。正如评论here中所指出的那样,人们可以做一些反思魔术来做同样的事情,但从我的理解中,无论如何都是“光”反射。

0 个答案:

没有答案