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

时间:2015-08-07 04:28:02

标签: java generics

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

new

(改编自Generics and the visitor pattern)。

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

1 个答案:

答案 0 :(得分:2)

它并没有摧毁它,只是让它变得丑陋。而不是:

 class MyVisitor implement Visitor<Element>{

   void visit(ElementA ea) {..}

   void visit(ElementB eB) {..}

} 

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

class MyVisitor implement Visitor<Element>{

   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接口。