使用访客模式和单独的 class 有什么区别?

What's the difference between using the Visitor pattern and a separate class?

我想知道访问者模式和使用静态方法分离执行代码有什么区别。

让我们看一个我可能会调用访客模式的示例:

  new AnalyticsVisitor.accept(myClass); 

例如,当从 myClass 调用时,会将工作转移到访问者中执行。如果它是内存密集型的,它甚至会更快地收集垃圾。

现在让我们看一下使用简单的方法来实现大致相同的事情:

  new AnalyticsManager.execute(myClass);

我有没有达到同样的目的?

  1. 我有代码分离。
  2. 我可以将其应用于多种数据结构
  3. 我可以在不更改遗留代码的情况下向其添加信息。

那么为什么要使用访问者模式而不是 class(除非双重分派)?

这个问题还是有点迷糊。我怀疑你还没有理解访问者模式的目标。

As discussed here当你有相对稳定的复杂数据结构(如解析树)(在开发方面),但你希望能够不断添加新操作时,访问者模式很有用在它的所有元素上。这对于标准的 OO 技术来说是笨拙的。


访问者模式所基于的技术是双重调度,所以当您说 "Why use the Visitor pattern unless for double-dispatch?" 时,您实际上是在说 "Why use the visitor pattern?"


您的示例代码仅包含客户端,因此不清楚您的新技术实际提供了什么。

所提供的代码对于真实的访问者模式来说似乎是倒退的。应该是:

my_datastructure.accept(analytics_visitor);

其中 analytics_visitor 继承自 MyDataStructureVisitor,并为数据结构可以容纳的每种元素类型提供单独的方法。


至于成就:

  1. "Code separation" 是一个模糊的术语。访问者模式允许在不定义所有操作(假定方法)的情况下定义数据结构。相反,它们可以单独定义 - 封装较差。)

  2. 不清楚将访问者模式应用于多个数据结构意味着什么。每个访客 class 与一个数据结构相关联。

  3. 目标不是将 'info' 添加到遗留代码中。就是在遗留代码中添加操作