使用Visitor模式和单独的类有什么区别?

时间:2018-08-29 03:02:58

标签: visitor-pattern

我想知道Visitor模式和使用静态方法分别执行代码之间的区别是什么。

让我们看一个我称之为“访客”模式的示例:

  new AnalyticsVisitor.accept(myClass); 

,例如,当从myClass调用时,会将工作移到访问者中执行。如果占用大量内存,它甚至可以更快地进行垃圾回收。

现在让我们看一下使用一种简单的方法来实现或多或少相同的事情:

  new AnalyticsManager.execute(myClass);

我完成了同样的事情吗?

  1. 我有代码分隔符。
  2. 我可以将其应用于多个数据结构
  3. 我可以在不更改原有代码的情况下添加信息。

那么,为什么要使用Visitor模式而不是仅使用类(除非用于双重调度)?

1 个答案:

答案 0 :(得分:2)

这个问题还是有点困惑。我怀疑您还不了解“访客”模式的目标。

As discussed here当您具有相对稳定的(就开发而言)相对稳定的复杂数据结构(例如解析树)时,访问者模式很有用,但是您希望能够继续在所有对象上添加新操作其元素。这与标准的OO技术笨拙。


访问者模式所基于的技术是两次发送,因此当您说“为什么不使用访问者模式,除非进行两次发送?”您实际上是在说“为什么使用访客模式?”


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

对于实际的访客模式,提供的代码似乎是向后的。应该是:

my_datastructure.accept(analytics_visitor);

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


至于成就:

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

  2. 目前尚不清楚将访问者模式应用于多个数据结构的含义。每个访问者类别都与一个数据结构相关联。

  3. 目标不是在遗留代码中添加“信息”。它将操作添加到旧代码中。