当我读到有关访客模式时,它就像是
允许在运行时将一个或多个操作应用于一组对象,从而将操作与对象结构分离。
如果我的假设是正确的,我们将定义一个抽象访问者,其中包含处理每个对象的方法。然后具体访问者将实现这些方法中的每一种。通过这个,我们将处理对象的逻辑从Object类分离到访问者实现。
我怀疑的是,如果我们只有一个访问者实现,我们真的需要使用这种模式吗?我们不能只将实现放在每个Object类中并直接调用它吗?如果我错过了介于两者之间的东西,请纠正我。
答案 0 :(得分:4)
实际上你从未真正需要使用 这种模式或任何其他模式。如果您使用模式是因为您根据您的上下文进行设计选择。
模式文档的几个项目旨在帮助您做出有关使用模式的明智决策。请特别注意以下部分:
如果您处于从对象结构中解耦操作的上下文,可能是因为将来会有新操作应用于这些对象,模式将改善您的设计。如果您处于生命周期有限的小程序环境中,那么模式可能是一种开销。
因此,请再次阅读模式文档,检查您的软件上下文,并做出明智的决定是否使用它。
答案 1 :(得分:1)
我不同意。
将逻辑放在对象中而不是将其放在访问者中并不总是可能或可取的。例如,持久性实体(用户或订单),"域的一部分"层,不必访问(或不应该访问)执行操作所必需的服务("服务"层的一部分):对订单进行计费,或者促进用户。
另外,仅仅因为现在只有一位访问者并不意味着其他人不会在以后出现。
模式的目标是脱钩。通过将操作放在被访问对象本身中,您不再需要解耦。
通过解耦,您还可以创建可重用的API。使用您的类的开发人员很可能无法修改它们,因为他/她根本没有源代码,因此无法对其进行更改。然而,它必须能够根据对象的实际具体类别做一些不同的事情。因此,访客模式。
答案 2 :(得分:-1)
您对访客模式的描述说明了一切:
从对象结构中解耦操作
在一个很好的分离的世界中,你将拥有包含对数据进行操作的数据和对象的对象。访客模式的目标是解耦这些。它可能不是您经常会明确看到的模式,但是您可以随处看到的基本原则。
通过解耦操作,您在SOLID(Open/Closed Principle)中使用O,该状态表明您可以在不更改源代码的情况下更改其行为。因为如果您希望对对象进行新的/删除/更改操作,只需添加/删除/更改此对象的访问者而不是对象本身。