【问题标题】:What's the difference between using the Visitor pattern and a separate class?使用访问者模式和单独的类有什么区别?
【发布时间】:2018-08-29 03:02:57
【问题描述】:

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

让我们看一个我可能称之为访问者模式的例子:

  new AnalyticsVisitor.accept(myClass); 

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

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

  new AnalyticsManager.execute(myClass);

我实现了同样的目标吗?

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

那么为什么要使用访问者模式而不仅仅是一个类(除非用于双重调度)?

【问题讨论】:

    标签: visitor-pattern


    【解决方案1】:

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

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


    访问者模式所基于的技术是双分派,所以当您说“为什么要使用访问者模式,除非是双分派?”您实际上是在说“为什么要使用访问者模式?”


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

    对于真正的访问者模式,提供的代码似乎是倒退的。应该是:

    my_datastructure.accept(analytics_visitor);
    

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


    关于成绩:

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

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

    3. 我们的目标不是向遗留代码添加“信息”。就是在遗留代码中添加操作

    【讨论】:

    • 我修复了我的语句中的一些语法错误。谢谢你的意见。好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多