6

据我了解,在访问者模式的典型规范中,访问对象决定了如何遍历,一般来说,它们只支持一种遍历顺序。(例如,请参见此处此处。)

是否有同样使用双分派的名称,但访客可以在哪里决定如何遍历对象层次结构?在我的应用程序中,一个非常异构的文档模型类型集合正在向访问者推送,例如导出操作。但是,说各种处理器(访问者)都应该按照广度优先顺序遍历似乎很僵硬。其中一些可能只关注模型的一个子集,或者可能需要以专门的顺序处理模型的某些部分。

我担心以非标准方式使用访问者模式中的名称会混淆其他开发人员。我建议的东西有名字吗?

我还会问是否有理由不让访问者控制遍历,以防万一我错过了通常的访问者公式中的一些智慧。如果可能相关,该应用程序是 Java 版本。

4

1 回答 1

4

为了保持设计清晰,您可以将遍历逻辑封装在 Iterator 中。访问者或被访问者可以使用迭代器来确定下一个要访问的节点。

在 wikipedia 上的 Visitor 示例中,我们看到 Car 类控制访问顺序如下:

public void accept(ICarElementVisitor visitor) {    
    for(ICarElement elem : elements) {
        elem.accept(visitor);
    }
    visitor.visit(this);    
}

根据迭代器模式 ,将遍历逻辑封装在从其方法ICarElementIterator返回的 an中会很容易。ICarElementnext()

于 2014-07-06T01:02:37.590 回答