使用访客模式和单独的 class 有什么区别?
What's the difference between using the Visitor pattern and a separate class?
我想知道访问者模式和使用静态方法分离执行代码有什么区别。
让我们看一个我可能会调用访客模式的示例:
new AnalyticsVisitor.accept(myClass);
例如,当从 myClass
调用时,会将工作转移到访问者中执行。如果它是内存密集型的,它甚至会更快地收集垃圾。
现在让我们看一下使用简单的方法来实现大致相同的事情:
new AnalyticsManager.execute(myClass);
我有没有达到同样的目的?
- 我有代码分离。
- 我可以将其应用于多种数据结构
- 我可以在不更改遗留代码的情况下向其添加信息。
那么为什么要使用访问者模式而不是 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,并为数据结构可以容纳的每种元素类型提供单独的方法。
至于成就:
"Code separation" 是一个模糊的术语。访问者模式允许在不定义所有操作(假定方法)的情况下定义数据结构。相反,它们可以单独定义 - 封装较差。)
不清楚将访问者模式应用于多个数据结构意味着什么。每个访客 class 与一个数据结构相关联。
目标不是将 'info' 添加到遗留代码中。就是在遗留代码中添加操作
我想知道访问者模式和使用静态方法分离执行代码有什么区别。
让我们看一个我可能会调用访客模式的示例:
new AnalyticsVisitor.accept(myClass);
例如,当从 myClass
调用时,会将工作转移到访问者中执行。如果它是内存密集型的,它甚至会更快地收集垃圾。
现在让我们看一下使用简单的方法来实现大致相同的事情:
new AnalyticsManager.execute(myClass);
我有没有达到同样的目的?
- 我有代码分离。
- 我可以将其应用于多种数据结构
- 我可以在不更改遗留代码的情况下向其添加信息。
那么为什么要使用访问者模式而不是 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,并为数据结构可以容纳的每种元素类型提供单独的方法。
至于成就:
"Code separation" 是一个模糊的术语。访问者模式允许在不定义所有操作(假定方法)的情况下定义数据结构。相反,它们可以单独定义 - 封装较差。)
不清楚将访问者模式应用于多个数据结构意味着什么。每个访客 class 与一个数据结构相关联。
目标不是将 'info' 添加到遗留代码中。就是在遗留代码中添加操作