访客模式可以用于执行通用双重调度吗?

如果您搜索访问者模式的通用版本,您会发现以下内容:

public abstract class Element { public void accept(Visitor v) { v.visit(this); } } public interface Visitor { void visit(T element); } 

(改编自Generics和访客模式 )。

但是,这似乎禁止双重调度,因为“第二次”调度 – 依赖于方法重载的调度 – 使用generics方法参数是不可能的。 那么,使用带有访问者模式的generics是否禁止双重调度?

它不会破坏它,只会让它变得丑陋。 而不是:

  class MyVisitor implement Visitor{ void visit(ElementA ea) {..} void visit(ElementB eB) {..} } 

您最终必须使用instanceof添加自己的调度:

 class MyVisitor implement Visitor{ void visit(Element e) { if(e instanceof ElementA) { //dispatch to the method visit((ElementA) e); else( e instanceof ElementB) { //or do the logic right here .. } } void visit(ElementA ea) {..} } 

编辑你可以有这样的解决方案:

 class ElementVisitor { void visit(ElementA ea) void visit(ElementB eb) 

}

如果现在客户喜欢:

  class ElementA { void accept(ElementVisitor ev) { ev.accept(this); // this call will be dispatched to visit(ElementA) } 

}

然后将访问调度到正确的方法。 这种方法的问题在于它不是通用的,您必须为每个要访问的类型系列编写不同的Visitor接口。 另一种方法是,您只有一个适用于所有类型的Visitor界面。