根据我发现的代码,似乎访问者需要知道访问对象的结构并调用所需的子代.在某些情况下,即使访问类被修改,访问者仍希望继续工作,这似乎有点笨拙.
我想真正的问题是:它们是一种模式,其中枚举是由访问过的代码而不是访问者代码完成的?
参观者对象是需要知道的是参观事物的结构.不过那没关系.您应该为访问者知道如何访问的每种类型的东西编写专门的访问操作.这允许访问者决定它真正想要访问多少以及以什么顺序访问.
假设你有一棵树.一个访问者可能会进行预订遍历,一个可能会执行有序遍历,而另一个访问者可能只对叶节点执行操作.访问者类可以执行所有这些操作,而无需对树类进行任何更改.
访问者知道结构,但这并不一定意味着访问者执行的操作知道所有结构.您可以将访问者与命令组合在一起.为访问者对象提供一个命令对象,访问者将在它访问的每个事物上调用该命令.
如果你想要一个简单的操作并让集合为你提供每个项目,那么你希望集合为自己提供一个迭代器.在迭代器为您提供的每个东西上调用您的函数.
如果要以各种顺序迭代树的节点,那么树将需要提供多个迭代器.如果要按树不支持的顺序处理节点,则需要修改树类.