相关疑难解决方法(0)

访客模式中accept()方法的重点是什么?

关于将算法与类分离的讨论很多.但是,有一件事没有解释.

他们像这样使用访客

abstract class Expr {
  public <T> T accept(Visitor<T> visitor) {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);
  }
Run Code Online (Sandbox Code Playgroud)

Visitor不会直接调用visit(element),而是要求元素调用其visit方法.它与所宣称的关于访客的阶级无意识的观念相矛盾.

PS1请用您自己的话解释或指出确切的解释.因为我得到的两个回答是指一般的和不确定的.

PS2我的猜测:由于getLeft()返回基本Expression,调用visit(getLeft())将导致visit(Expression),而getLeft()调用visit(this)将导致另一个更合适的访问调用.因此,accept()执行类型转换(也称为转换).

PS3 Scala的模式匹配=类固醇上的访客模式显示没有接受方法访问者模式的简单程度.维基百科补充说:通过链接一篇论文,显示" accept()当反射可用时,方法是不必要的;为该技术引入术语'Walkabout'."

design-patterns visitor

77
推荐指数
2
解决办法
2万
查看次数

标签 统计

design-patterns ×1

visitor ×1