据我了解,在Visitor模式的典型规范中,由访问对象决定如何遍历,通常,它们仅支持一个遍历顺序。 (例如,参见here或here。)
是否有相同用法的双调度名称,但是访问者在哪里决定如何遍历对象层次结构?在我的应用程序中,文档模型类型的种类非常繁多,正朝着访问者的方向插入,例如导出操作。但是,似乎很难说各种处理器(访问者)都应按宽度优先顺序遍历。他们中的一些人可能只关心模型的一个子集,或者可能需要按照专门的顺序处理模型的各个部分。
我担心通过以非标准方式使用访客模式中的名称来混淆其他开发人员。我要说的名字有没有名字?
我还要问是否有理由不让访问者控制遍历,以防万一我缺少常用的“访问者”表达方式。如果可能的话,该应用程序使用Java。
最佳答案
为了使设计清晰,可以将遍历逻辑封装在Iterator中。一个或多个访问者可以使用迭代器来确定下一个要访问的节点。
在Wikipedia的“访客”示例中,我们看到“汽车”控制类的访问顺序如下:
public void accept(ICarElementVisitor visitor) {
for(ICarElement elem : elements) {
elem.accept(visitor);
}
visitor.visit(this);
}
很容易将遍历逻辑封装在
ICarElementIterator
中,该文件按照Iterator模式从其ICarElement
方法返回next()
。