我正在寻找一种简洁的设计来模拟访客功能,而没有它所具有的许多缺点。在 Java 中,传统的实现(如 GoF 中所述)采用双重调度来摆脱 if-else。为了解决这个问题,我看到了一些使用反射来避免修改“Visitable”类的实现,但是这些实现在查找方法名称时依赖于硬编码的字符串。虽然很有用,但我仍然认为它们不是干净的设计。
是否可以使用数据结构和/或良好的 OO 设计来模拟相同的想法?它不一定是模式,只是我正在寻找解决类似问题的示例(例如:使用 a 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();
}
我认为实际上是模板模式和命令模式的混合。随时发表您对如何增强它的建议。