如果您搜索访客模式的通用版本,您会发现以下内容:
new
(改编自Generics and the visitor pattern)。
然而,这似乎禁止双重调度,因为“第二次”调度 - 依赖于方法重载的调度 - 对于泛型方法参数是不可能的。那么,使用带有访问者模式的泛型是否禁止双重调度?
答案 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
接口。