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?
答案 0 :(得分:0)
我认为您必须这样做才能确保为所有visit()
中的所有ICarElement
提供相应的ICarElementVisitor
方法
因此,如果您撰写新的ICarElement
,请说IWheel
,一年之后,如果您不记得已经存在的所有访问者,您将有义务实施accept(ICarElementVisitor)
执行编译器的visitor.visit(this);
执行的方法:" ICARElementVisitor中没有方法访问(IWheel)!"因此,您将在visit(IWheel)
界面中添加ICarElementVisitor
,编译器会说" CarElementDoVisitor不会实现ICarElementVisitor的所有方法!"并且您将在visit(IWheel)
中实施CarElementDoVisitor
,因此您一定会避免回归。
我认为这样做的重点并非毫无用处,事实上这是一件好事。