在维基百科sample和GoF书中,访客模式的使用通过在某个接受者上调用accept
方法开始。但为什么这样呢?为什么我们不能开始用期望的acceptor作为参数调用visit
方法?我们仍然可以根据访问者和接受者(双派遣)这两种类型制定访客行为 - 并且我们可以消除多余的呼叫(就我而言)。为什么我们通过调用Acceptor.accept()而不是Visitor.visit()来启动Visitor?
这里的示例代码来说明这一点:
public interface Visitor {
void visit(AcceptorA acceptor);
void visit(AcceptorB acceptor);
}
//
// Visitor which sings
//
class SingingVisitor implements Visitor {
public void visit(AcceptorA acceptor) {
System.out.println("sing A");
}
public void visit(AcceptorB acceptor) {
System.out.println("sing B");
}
}
//
// Visitor which talks
//
class TalkingVisitor implements Visitor {
public void visit(AcceptorA acceptor) {
System.out.println("talk A");
}
public void visit(AcceptorB acceptor) {
System.out.println("talk B");
}
}
//
// Acceptor subclasses
//
class AcceptorA implements BaseAcceptor {
}
class AcceptorB implements BaseAcceptor {
}
//
// Launcher class
//
class VisitorMain {
public static void main(String[] args) {
Visitor v = new TalkingVisitor();
AcceptorA a = new AcceptorA();
AcceptorB b = new AcceptorB();
v.visit(a);
v.visit(b);
v = new SingingVisitor();
v.visit(a);
v.visit(b);
}
}
这只是一个例子 - 没有人说它必须以这种方式实施。 – 2012-01-10 19:43:42
@DaveNewton我已经问过这个问题了,看看我是否忽略了GoF方法的某些优点,还是仅仅是一个约定。 – 2012-01-10 19:45:33