访客模式可以用于执行通用双重调度吗?
如果您搜索访问者模式的通用版本,您会发现以下内容:
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
界面。