访问者模式:覆盖与重载

时间:2013-12-22 14:57:21

标签: java overloading override visitor

要在Java中实现访客模式,您可以使用覆盖或重载。选择是取决于还是总是优先选择其中之一?因为我没有看到任何缺点。因为我认为第一个和第三个例子总能完成这项工作吗?

覆盖

的访客
public interface Visitor {
   public void visitX(X x);
   public void visitY(Y y);
}
public class ConcreteVisitor {
   public void visitX(X x) { ... }
   public void visitY(Y y) { ... }
}

public abstract class XY {
   public abstract void accept(Visitor v);
}
public class X extends XY {
   // alternative: one implementation with reflection possible in super class
   public void accept(Visitor v) {
       v.visitX(this);
   }
}
public class Y extends XY {
   // alternative: one implementation with reflection possible in super class
   public void accept(Visitor v) {
       v.visitY(this);
   }
}

超载的访客

public interface Visitor {
   public void visit(XY xy); // dummy (couldn't otherwise been used in XY class)
   public void visit(X x);
   public void visit(Y y);
}
public class ConcreteVisitor {
   public void visit(XY xy) { ... }
   public void visit(X x) { ... }
   public void visit(Y y) { ... }
}

public abstract class XY {
   public void accept(Visitor v) {
      v.visit(this); // Which is the compile-time/static type of this? XY?
   }
}
public class X extends XY {

}
public class Y extends XY {

}

更好的访客超载

public interface Visitor {
   public void visit(X x);
   public void visit(Y y);
}
public class ConcreteVisitor {
   public void visit(X x) { ... }
   public void visit(Y y) { ... }
}

public abstract class XY {
   public abstract void accept(Visitor v);
}
public class X extends XY {
   public void accept(Visitor v) {
      v.visit(this);
   }
}
public class Y extends XY {
  public void accept(Visitor v) {
      v.visit(this);
  }
}

2 个答案:

答案 0 :(得分:3)

访问者模式实质上是关于用单一调度语言覆盖双重调度的重要用例。它以两步成语利用单一调度机制。因此,如果您对这两个步骤之一使用反射,则不再实现访问者。

是否使用重载的问题是一个小问题,因为它只能选择所有visit方法的名称。您可以使用其中任何一种,但在专业代码中重载更有意义。在研究模式时,单独的名称将使访问模式更容易理解,这有点因其复杂性而臭名昭着。

答案 1 :(得分:1)

任何行为都是如此,而不仅仅是访客。当然,您可以选择其中一种。两者都有效。

听起来像是“界面或抽象类”的重演?题。当可能存在有意义的非抽象默认行为时,您更喜欢抽象。接口没有默认值,因此每个用户都被迫实现该方法。没有任何假设是可能的。