有很多关于从类中解耦算法的讨论,但是,有一件事没有解释。
他们就是这样利用访客的
abstract class Expr {
public <T> T accept(Visitor<T> visitor) { return visitor.visit(this); }
}
class ExprVisitor extends Visitor{
public Integer visit(Num num) {
return num.value;
}
public Integer visit(Sum sum) {
return sum.getLeft().accept(this) + sum.getRight().accept(this);
}
public Integer visit(Prod prod) {
return prod.getLeft().accept(this) * prod.getRight().accept(this);
}
Visitor 没有直接调用 access (element) ,而是要求元素调用它的 access 方法。它与所宣称的对来访者缺乏阶级意识的观点相矛盾。
请用你自己的话解释或指出确切的解释。因为我得到的两个回答是笼统的和不确定的。
我的猜测是: 由于 getLeft()
返回基本的 Expression
,调用 visit(getLeft())
将导致 visit(Expression)
,而调用 getLeft()
将导致另一个更合适的访问调用。因此,accept()
执行类型转换(即强制转换)。
PS3Scala 的模式匹配 = 类固醇的访问者模式展示了如果没有接受方法,Visitor 模式会简单得多。维基百科补充了这一说法: 通过链接一篇论文,表明“当反射可用时,accept()
方法是不必要的; 为该技术引入术语‘漫游’。”