首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访客模式

访客模式
EN

Stack Overflow用户
提问于 2015-05-27 15:23:00
回答 3查看 482关注 0票数 4

当我读到访客模式的时候,上面写着

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

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

我怀疑如果我们只有一个访问者实现,我们真的需要使用这个模式吗?我们不能把实现放在每个对象类中并直接调用它吗?如果我在中间遗漏了什么,请纠正我。

EN

回答 3

Stack Overflow用户

发布于 2015-06-10 14:02:50

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

模式文档的几个项目旨在帮助您就是否使用该模式做出明智的决定。具体而言,请查看以下各节:

  • 意图:描述模式背后的目标以及使用它的原因。
  • 动机(力):由一个问题和一个可以使用这种模式的环境组成的情景。
  • 适用性:此模式可用的情况;该模式的上下文。
  • 后果:对使用该模式所造成的结果、副作用和权衡的描述。

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

因此,请重新阅读模式文档,检查您的软件上下文,并就是否使用它做出知情的决定。

票数 4
EN

Stack Overflow用户

发布于 2015-05-27 15:58:38

我不同意。

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

而且,仅仅因为现在只有一个访客,并不意味着其他人以后就不会出现。

这种模式的目标是脱钩。通过将操作放入访问对象本身,就不再存在解耦。

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

票数 1
EN

Stack Overflow用户

发布于 2015-06-10 13:40:20

您对访问者模式的描述说明了这一切:

对象结构的解耦操作

在一个解耦良好的世界中,您将拥有保存数据的对象和操作数据的对象。访问者模式的目标是将这些解耦。这可能不是你经常会看到的模式,但是你会在任何地方看到基本的主体。

通过解耦操作,您可以使用O in SOLID (开放/封闭原则),它声明您可以在不更改源代码的情况下更改其行为。因为如果希望对对象进行新的/remove/change操作,只需添加/删除/更改该对象的访问者,而不是对象本身。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30486709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档