访客模式

时间:2015-05-27 15:23:01

标签: design-patterns visitor-pattern

当我读到有关访客模式时,它就像是

  

允许在运行时将一个或多个操作应用于一组对象,从而将操作与对象结构分离。

如果我的假设是正确的,我们将定义一个抽象访问者,其中包含处理每个对象的方法。然后具体访问者将实现这些方法中的每一种。通过这个,我们将处理对象的逻辑从Object类分离到访问者实现。

我怀疑的是,如果我们只有一个访问者实现,我们真的需要使用这种模式吗?我们不能只将实现放在每个Object类中并直接调用它吗?如果我错过了介于两者之间的东西,请纠正我。

3 个答案:

答案 0 :(得分:4)

实际上你从未真正需要使用 这种模式或任何其他模式。如果您使用模式是因为您根据您的上下文进行设计选择。

模式文档的几个项目旨在帮助您做出有关使用模式的明智决策。请特别注意以下部分:

  • 意图:描述模式背后的目标及其使用原因。
  • 动机(力量):由问题和可以使用此模式的上下文组成的场景。
  • 适用性:该模式可用的情况;模式的上下文。
  • 后果:使用该模式导致的结果,副作用和权衡的描述。

如果您处于从对象结构中解耦操作的上下文,可能是因为将来会有新操作应用于这些对象,模式将改善您的设计。如果您处于生命周期有限的小程序环境中,那么模式可能是一种开销。

因此,请再次阅读模式文档,检查您的软件上下文,并做出明智的决定是否使用它。

答案 1 :(得分:1)

我不同意。

将逻辑放在对象中而不是将其放在访问者中并不总是可能或可取的。例如,持久性实体(用户或订单),"域的一部分"层,不必访问(或不应该访问)执行操作所必需的服务("服务"层的一部分):对订单进行计费,或者促进用户。

另外,仅仅因为现在只有一位访问者并不意味着其他人不会在以后出现。

模式的目标是脱钩。通过将操作放在被访问对象本身中,您不再需要解耦。

通过解耦,您还可以创建可重用的API。使用您的类的开发人员很可能无法修改它们,因为他/她根本没有源代码,因此无法对其进行更改。然而,它必须能够根据对象的实际具体类别做一些不同的事情。因此,访客模式。

答案 2 :(得分:-1)

您对访客模式的描述说明了一切:

  

从对象结构中解耦操作

在一个很好的分离的世界中,你将拥有包含对数据进行操作的数据和对象的对象。访客模式的目标是解耦这些。它可能不是您经常会明确看到的模式,但是您可以随处看到的基本原则。

通过解耦操作,您在SOLID(Open/Closed Principle)中使用O,该状态表明您可以在不更改源代码的情况下更改其行为。因为如果您希望对对象进行新的/删除/更改操作,只需添加/删除/更改此对象的访问者而不是对象本身。