【问题标题】:Command Pattern vs. Visitor Pattern命令模式与访问者模式
【发布时间】:2011-02-20 22:06:36
【问题描述】:

允许访问者修改接收者的状态通常是可以接受的,还是应该改为命令模式?

【问题讨论】:

    标签: design-patterns command-pattern visitor-pattern mutability


    【解决方案1】:

    访问者模式的目的是允许在不修改该层次结构的情况下将新操作添加到类层次结构中。我从未见过有人建议只接受只读操作。唯一的限制是添加的操作只能使用类层次结构的公共接口。

    【讨论】:

      【解决方案2】:

      我认为你不能一概而论地说明修改任何事物的状态是好是坏。我认为修改状态是可以的,只要它不影响访问逻辑本身。例如,您可以编写一个访问者,访问文件夹结构下的所有文件并将文件名重命名为大写。

      【讨论】:

      • 在某些情况下,人们肯定可以说改变状态是好事还是坏事。访问者模式预计将用于状态更改是可能的,甚至是可能的。而对于观察者模式,观察者不应该改变状态。
      • 用户,评论事件,惩罚者监听器会在说一些暴力话后禁止用户吗? :-)
      【解决方案3】:

      Microsoft 的访问者修改接收器的示例是ExpressionVisitor。 ExpressionVisitor 类的目的是修改表达式树。所以我猜微软至少认为这是可以接受的。

      【讨论】:

      • 微软并不总是最好的指南,知道什么是对错:ayende.com/blog/35841/…
      • 当有人说“权威 X 认为 Y 是可以接受的”时,标准解释是你通过上诉权威 X 来支持 Y。 argumentum ad verecundiam.
      • @Jason 当然我会认为微软是权威。我是说这里是这个权威认为这种模式可以接受的一个例子。但我是说他们是“最好的向导”吗?不 。我让提问者来决定他们是否正确。
      【解决方案4】:

      每种模式都有自己的优点、缺点和用例。

      您可以使用Command 模式来

      1. 解耦命令的调用者和接收者

      2. 实现回调机制

      3. 实现撤消和重做功能

      4. 维护命令历史

      在以下场景中使用Visitor 模式:

      1. 必须对结构中分组的不同类型的对象执行类似的操作
      2. 您需要执行许多不同且不相关的操作。它将 Operation 与对象 Structure 分开
      3. 必须添加新操作不改变对象结构

      相关帖子:

      Using Command Design pattern

      When should I use the Visitor Design Pattern?

      【讨论】: