gpt4 book ai didi

java - 设计模拟 Visitor 而没有其缺点

转载 作者:行者123 更新时间:2023-11-29 08:09:44 29 4
gpt4 key购买 nike

我正在寻找一种简洁的设计来模拟 Visitor 的功能,而没有它的许多缺点。在 Java 中,传统的实现(如 GoF 中所述)采用双重分派(dispatch)来摆脱 if-elses。为了解决这个问题,我看到了一些使用反射来避免修改“可见”类的实现,但这些实现在查找方法名称时依赖于硬编码字符串。虽然很有用,但我仍然认为它们不是干净的设计。

是否可以使用数据结构和/或良好的 OO 设计来模拟相同的想法?它不一定是一种模式,我只是在寻找解决类似问题的示例(例如:使用 Map<Class<T>,SomeFunctionObject> )。


更新像这样的东西:

    public abstract class BaseVisitor<T> {

private final TypesafeHeterogeneusMap map;

protected BaseVisitor(){
map = inflateFunctions();
}

public <E extends T> void process(E element){
if(element == null){
throw new NullPointerException();
}
boolean processed = false;

@SuppressWarnings("unchecked")
Class<? super T> sc = (Class<? super T>) element.getClass();

while(true){
if(sc != null){
FunctionObject<? super T> fo2 = map.get(sc);
if(fo2 != null){
fo2.process(element);
processed = true;
break;
}
sc = sc.getSuperclass();
} else {
break;
}
}

if(!processed) System.out.println("Unknown type: " + element.getClass().getName());
}

abstract TypesafeHeterogeneusMap inflateFunctions();
}

我认为实际上是模板模式和命令模式的混合体。请随时发表有关如何改进它的建议。

最佳答案

您可以让所有的 Visitor 实现扩展一个基类,它为每种类型的 Visitable 提供默认实现:

public interface AnimalVisitor {
void visitHorse(Horse horse);
void visitDog(Dog dog);
}

public class BaseAnimalVisitor implements AnimalVisitor {
public void visitHorse(Horse horse) {
// do nothing by default
}
public void visitDog(Dog dog) {
// do nothing by default
}
}

然后,当引入一个新的类Cat时,你在接口(interface)和基类中添加visitCat(Cat cat)方法,剩下所有的访问者不变,仍然编译。如果他们不想忽略猫,那么您可以覆盖 visitCat 方法。

关于java - 设计模拟 Visitor 而没有其缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836516/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com