典型的访问者基本上根据从接受(对象)开始的类型来调度访问者。
想象一个在 Collection 接口上工作的访问者。
enum Visiting {
STOP
CONTINUE;
}
Visitor {
accept( Object );
Visiting visit( Object );
Visiting visit( Map );
Visiting visit( List );
Visiting visit( Set );
Visiting visit( Collection );
Visiting visit( ArrayList).
}
典型访问者中的 >ArrayList< 只会调用 visit(List)。调用 visit(Object) -> visit(Collection) -> visit(List) -> visit(ArrayList) 有什么好处吗?如果任何访问返回 Visiting.STOP 链中的下一个不被调用?
有什么可能的论据会使这成为一个糟糕的选择?
- (-) 性能,而不是简单地根据类型调用一次访问,整个链都会发生。
- (+) 易于基于某些超类型集中常用操作,无需重复。