我确定这一定是访问者模式的常见问题,所以我想看看是否有标准解决方案。
你怎么能重新编码一个树遍历,其中方法被内置到树类本身中,比如说
class Node {
void Traverse(SomeType& t) { ... }
};
到使用访问者的代码中。想到的两个解决方案是
class Visitor {
stack<SomeType> argumentStack;
void Visit() {
// do work, add new arguments onto stack
// call accept() on child objects
// pop stack
}
};
或将参数添加到 accept(Visitor&) 和 visit() 方法本身。但这并不比类中内置的原始遍历更好。
另一个问题是,如果每个内置遍历方法都采用不同的参数,或者一些返回值而另一些没有,或者它们不都返回相同的类型,会发生什么?