我有很多类,它们都派生自类AbstractVariable。我需要将它们收集到相应的列表中,因为我需要使用它们。将它们收集到一个列表中,然后按 getter 的实例过滤它们可能更简单,但我不确定性能。
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);
}
}
其中一些是类,其中一些是装饰器接口。访问者似乎有点矫枉过正,因为它必须在包括子类在内的所有类中声明,并且考虑到一个类可能有多个接口,维护将是可怕的。
这不是类或接口的最终列表。它会变得更大。
现在我真的在考虑 getter 过滤,因为这个选择只是在算法的最开始。
问题是 - 在这件事上最好的设计选择是什么?游客?吸气剂过滤?维护不同的列表?还是其他一些设计模式?
在Google上查看访问者模式设计,作为一些介绍性解释,您需要在AbstractVariable类中创建一个accept(Visitor(方法,该方法接收访问者实例并执行visitor.visit(this(。然后在 Visitor 类中,您创建与 AbstarctVariable 存在的子类一样多的方法,每个方法都应该称为 visit(SubclassX(,SubclassX 将是每个 AbstractVariable 子类。最后 visit(SubclassX( 方法需要在 AbstractVariable 上调用一个 addSublassX(SubclassX(,这个方法应该负责将 SubclassX 的实例添加到相应的 List 中。