【发布时间】:2015-05-05 22:24:43
【问题描述】:
interface ICarElementVisitor {
void visit(Engine engine);
}
interface ICarElement {
//want to use this
void accept(ICarElementVisitor visitor); // CarElements have to provide accept().
}
static class Engine implements ICarElement {
...
//want to avoid using this
public void accept(ICarElementVisitor visitor) {
visitor.visit(this);
}
}
...
public void accept(ICarElementVisitor visitor) {
for (ICarElement elem : elements) {
elem.accept(visitor);
}
visitor.visit(this);
}
...
static class CarElementDoVisitor implements ICarElementVisitor {
public void visit(Engine engine) {
System.out.println("Starting my engine");
}
}
有没有办法避免在访问者模式中的每个元素内部使用自调用方法并使用父类的全局方法?或者如果没有instanceof if 或switch,我是否可以传递父对象并知道该对象是什么实例?
【问题讨论】:
-
AFIAK 不在 Java 中。您的编译器需要对访问者方法进行早期绑定,因此它需要知道确切的类型。你可以看到更多关于 Java 如何在编译时选择正确的方法here。
-
为什么要避免这种情况?这是一个多态调用,是访问者模式本质的一部分。
visitor.visit(this)允许轻松扩展新功能,即,您可以编写新的访客代码,而您永远不必触摸ICarElement代码。使用instanceof意味着对于每种其他类型的访客,您必须为instanceof添加新检查。我猜你还没有理解访问者解决的问题,因为你提出的问题让问题再次出现。 -
我不想使用 visitor.visit(this);在我想去的每一堂课中
标签: java design-patterns casting visitor-pattern