【发布时间】:2014-07-04 02:13:57
【问题描述】:
据我了解,在访问者模式的典型规范中,是被访问的对象决定如何遍历,一般来说,它们只支持一种遍历顺序。 (参见,例如,here 或 here。)
是否有相同用法的双重分派的名称,但访问者可以决定如何遍历对象层次结构?在我的应用程序中,一个非常异构的文档模型类型集合正在向访问者推送,例如导出操作。但是,说各种处理器(访问者)都应该按照广度优先顺序遍历似乎很僵硬。其中一些可能只关注模型的一个子集,或者可能需要按特定顺序处理模型的某些部分。
我担心以非标准方式使用访问者模式中的名称会混淆其他开发人员。我的建议有名称吗?
我还会问是否有理由不让访问者控制遍历,以防万一我缺少的通常的访问者公式中有一些智慧。如果可能相关,应用程序是 Java 语言。
【问题讨论】:
-
你是怎么解决这个问题的? IMO 如果我们让访问者调用“接受”方法(即访问者选择遍历顺序),我们将完全违背模式,因为当我们更改“访问”对象的实现时,我们将需要完全更改访问者。
-
我发现对于我的用例来说,遍历模型的各种函数之间几乎没有足够的重叠,因此抽象是没有帮助的。例如,一些函数需要在计算的各个阶段返回或另一种类型的数据,一些需要传递各种类型的多个参数,等等。
-
我发现这篇文章很有趣tech.puredanger.com/2007/07/16/visitor。另请参阅 cmets 中关于将“访问逻辑”放在何处的讨论。
标签: design-patterns visitor-pattern double-dispatch