design-patterns - 为什么访问者负责在访问者模式中枚举子级?

标签 design-patterns enumeration visitor-pattern

根据我发现的代码,似乎需要访问者知道被访问对象的结构并调用所需的子对象。在某些情况下,即使访问的类被修改,访问者也希望继续工作,这似乎有点笨拙。

我想真正的问题是:它们是一种由访问代码而不是访问者代码完成枚举的模式吗?

最佳答案

访问者对象需要知道它访问的事物的结构。不过没关系。您应该为访问者知道如何访问的每种类型的事物编写专门的访问操作。这允许访问者决定它真正想要访问多少以及以什么顺序访问。

假设你有一棵树。一个访问者可能进行预序遍历,一个可能进行中序遍历,而另一个访问者可能只对叶节点进行操作。访问者类可以完成所有这些事情,而无需对树类进行任何更改。

访问者知道结构,但这并不一定意味着访问者执行的操作知道所有结构。您可以将访问者与命令结合使用。给访问者对象一个命令对象,访问者将在它访问的每个事物上调用该命令。

如果你想有一个简单的操作,让集合给你每个项目来操作,那么你希望集合提供一个迭代器 为自己。在迭代器给你的每一件事上调用你的函数。

如果您想以各种顺序迭代树的节点,那么树将需要提供多个迭代器。如果要按树不支持的顺序处理节点,则需要修改树类。

关于design-patterns - 为什么访问者负责在访问者模式中枚举子级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/522803/

相关文章:

oop - Golang 在具有私有(private)访问权限的结构中嵌入接口(interface)

c# - C# 中的委托(delegate)模式与委托(delegate)关键字

java - 在枚举中不是常量

c++ - 如何在派生类中访问聚合

google-analytics - 谷歌分析 : Easy way to report on users who visit Page A and Page B in the same session?

java - 设计包含生成 ID 的 Java 类的最佳方法

java - 构建器模式和大量强制参数

ios - 如何停止枚举 NSAttributedString 的属性?

用于将字符串限制为多个离散值的 JavaScript 习惯用法

c# - 树遍历 API 的访问者模式与 LINQ 风格的流畅语法