1

我有很多类,它们都派生自 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);
}



}

其中一些是类,其中一些是装饰器接口。访问者似乎是一种过度杀伤,因为它必须在包括子类在内的所有类中声明,并且考虑到一个类可能有多个接口,维护将是可怕的。

这不是类和接口的最终列表。它会变得更大。

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

问题是——在这个问题上最好的设计选择是什么?游客?吸气剂过滤?维护不同的列表?还是其他一些设计模式?

4

1 回答 1

0

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

于 2019-06-30T08:09:33.540 回答