访问者模式,访问者选择如何遍历

时间:2014-07-04 02:13:57

标签: design-patterns visitor double-dispatch

据我所知,在访问者模式的典型规范中,访问对象决定了如何遍历,通常,它们只支持一个遍历顺序。 (例如,请参阅herehere。)

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

我担心通过以非标准方式使用访问者模式中的名称来混淆其他开发人员。是否有我建议的名称?

我还会问,是否有理由不让访问者控制遍历,以防万一我常常缺少访客配方中的一些智慧。如果可能相关,则应用程序使用Java。

1 个答案:

答案 0 :(得分:2)

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

在维基百科上的访客示例中,我们看到Car类控制访问顺序如下:

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

将遍历逻辑封装在ICarElementIterator中,根据Iterator模式从ICarElement方法返回next()将很容易。