有没有办法避免在访问者模式的每个元素中使用自调用方法?
Is there a way to avoid using method for self invoke inside every element in Visitor Pattern?
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");
}
}
有没有办法避免在访问者模式的每个元素内部使用自调用方法而使用父class的全局方法?或者,如果我可以传递父对象并在没有 instanceof if 或 switch 的情况下知道该对象是什么实例?
我认为您必须这样做才能确保所有 ICarElement
中的所有 ICarElementVisitor
都具有相应的 visit()
方法
因此,如果您编写一个新的 ICarElement
,比如说 IWheel
,一年后您不记得所有已经存在的访问者,您将不得不实施 accept(ICarElementVisitor)
方法做 visitor.visit(this);
编译器会说:"there is no method visit(IWheel) in ICarElementVisitor!" 所以你会在 ICarElementVisitor
接口中添加 visit(IWheel)
编译器会说 "CarElementDoVisitor don't implement all methods of ICarElementVisitor!" 然后你会在 CarElementDoVisitor
中实施 visit(IWheel)
,这样您一定会避免倒退。
我觉得这样做的目的并没有什么用,其实是件好事。
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");
}
}
有没有办法避免在访问者模式的每个元素内部使用自调用方法而使用父class的全局方法?或者,如果我可以传递父对象并在没有 instanceof if 或 switch 的情况下知道该对象是什么实例?
我认为您必须这样做才能确保所有 ICarElement
中的所有 ICarElementVisitor
visit()
方法
因此,如果您编写一个新的 ICarElement
,比如说 IWheel
,一年后您不记得所有已经存在的访问者,您将不得不实施 accept(ICarElementVisitor)
方法做 visitor.visit(this);
编译器会说:"there is no method visit(IWheel) in ICarElementVisitor!" 所以你会在 ICarElementVisitor
接口中添加 visit(IWheel)
编译器会说 "CarElementDoVisitor don't implement all methods of ICarElementVisitor!" 然后你会在 CarElementDoVisitor
中实施 visit(IWheel)
,这样您一定会避免倒退。
我觉得这样做的目的并没有什么用,其实是件好事。