Есть ли какое-то преимущество в использовании шаблона посетителя в рекурсивном сценарии? Если да, то можете ли вы продемонстрировать это программно?
Шаблон посетителя и рекурсия
Ответы (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
Это действительно рекурсивно? Я либо что-то упускаю, либо это не так. Я думаю, вы хотите (в своем классе VisitNode) visitor.visit(this); а затем вы вызываете this.visit(слева) (и справа). См. эту ссылку.
- person javamonkey79; 06.11.2014
Поправляя мой последний комментарий, он должен быть left.visit(visitor) (и right)
- person javamonkey79; 06.11.2014
этот код кажется мне неправильным. Разве
NodeVisitor.visit
не должен позвонить node.visit(this)
? И тогда VisitableNode.visit
должен вызвать left.visit(visitor)
, но это всего лишь уровень косвенности. Кроме того, этот ответ на самом деле не показывает преимущества шаблона «Посетитель».
- person lucidbrot; 08.04.2018
Я думаю, что основное преимущество заключается в том, что для этого требуются только итерации по коллекциям на уровне 1. Он может перезвонить, но, по крайней мере, метод accept() будет чистым.
person
theG
schedule
08.04.2009