Шаблон посетителя и рекурсия

Есть ли какое-то преимущество в использовании шаблона посетителя в рекурсивном сценарии? Если да, то можете ли вы продемонстрировать это программно?


person Raúl Roa    schedule 08.04.2009    source источник


Ответы (2)


Как насчет обхода бинарного дерева? например

private class NodeVisitor{
 public void visit(VisitableNode<T> node){
    if (node!=null) {
       print node.data;
    }
 }
}



public class VisitableTree<T> {

  private VisitableNode<T> root;
  public void printNodes(){
    new NodeVisitor.visit(root);
  }

 private class VisitableNode<T> {
     T data;
     VisitableNode<T> left;
     VisitableNode<T> right; 
     public void visit(NodeVisitor<T> visitor){
       ..do something
       visitor.visit(left);
       visitor.visit(right);
    }
  }
}
person Steve B.    schedule 08.04.2009
comment
Это действительно рекурсивно? Я либо что-то упускаю, либо это не так. Я думаю, вы хотите (в своем классе VisitNode) visitor.visit(this); а затем вы вызываете this.visit(слева) (и справа). См. эту ссылку. - person javamonkey79; 06.11.2014
comment
Поправляя мой последний комментарий, он должен быть left.visit(visitor) (и right) - person javamonkey79; 06.11.2014
comment
этот код кажется мне неправильным. Разве NodeVisitor.visit не должен позвонить node.visit(this)? И тогда VisitableNode.visit должен вызвать left.visit(visitor), но это всего лишь уровень косвенности. Кроме того, этот ответ на самом деле не показывает преимущества шаблона «Посетитель». - person lucidbrot; 08.04.2018

Я думаю, что основное преимущество заключается в том, что для этого требуются только итерации по коллекциям на уровне 1. Он может перезвонить, но, по крайней мере, метод accept() будет чистым.

person theG    schedule 08.04.2009