java - 在按类类型或接口(interface)收集实例的情况下如何替换 instanceof

标签 java instanceof visitor-pattern choco

我有很多类,它们都是从 AbstractVariable 类派生的。我需要将它们收集到相应的列表中,因为我需要使用它们。将它们收集到一个列表中,然后通过 getter 通过 instanceof 过滤它们可能会更简单,但我不确定性能。

public class VariableRecorder {

private static List<Beacon> beacons = new LinkedList<>();
private static List<Engineer> engineers = new LinkedList<>();
private static List<Heli> helis = new LinkedList<>();
private static List<Locatable> locatables = new LinkedList<>();
private static List<Location> locations = new LinkedList<>();




public static void record(AbstractVariable av) {
    if(av instanceof Engineer)
        engineers.add((Engineer) av);
    if(av instanceof Heli)
        helis.add((Heli) av);
    if(av instanceof Locatable)
        locatables.add((Locatable) av);
    if(av instanceof Location)
        locations.add((Location) av);
    if(av instanceof Beacon)
        beacons.add((Beacon) av);
}



}

其中一些是类,一些是装饰器接口(interface)。 Visitor 似乎有点大材小用,因为它必须在包括子类在内的所有类中声明,并且考虑到一个类可能有多个接口(interface),维护起来会很糟糕。

这不是类或接口(interface)的最终列表。它会变得更大。

现在我真的在考虑 setter/getter 过滤,因为这个选择只是在算法的最开始。

问题是 - 在这件事上最好的设计选择是什么?游客? setter/getter 过滤?维护不同的列表?或者其他一些设计模式?

最佳答案

在 Google 上查看访客模式设计,作为一个简单的介绍性说明,您需要在 AbstractVariable 类中创建一个 Accept(Visitor) 方法,该方法接收一个 Visitor 实例并执行 Visitor.visit(this) 操作。然后在 Visitor 类中,您创建与 AbstarctVariable 子类一样多的方法,每个方法都应称为访问(SubclassX),并且 SubclassX 将成为 AbstractVariable 子类中的每一个。最后,visit(SubclassX)方法需要调用AbstractVariable上的addSublassX(SubclassX),该方法应该负责将SubclassX的实例添加到相应的List中。

关于java - 在按类类型或接口(interface)收集实例的情况下如何替换 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129095/

相关文章:

javascript - 通过窗口传递对象时 instanceof 运算符失败

c++ - 带有解引用指针的多态性会产生意想不到的结果……为什么?

java - 将偶数和奇数写入 da 文件

java - 通过 Java 获取 Activity 监视器 (Mac OSX)

java - 没有必要将 instanceof 与原始类型数组一起使用吗?

javascript - 什么是字符串文字和实例?

java - 删除文本文件中的多余行

java - HQL - 还记得序数参数是从 1 开始的吗?

c++ - 访客模式添加新功能

java - 根据类中的字段选择方法