访客和策略模式之间有什么区别?

swa*_*kam 9 java design-patterns strategy-pattern visitor-pattern

我已经学会了这两种模式但却不理解这两种模式之间的差异.

我不知道场景,何时何地使用这些模式.

任何人都可以解释差异和用例吗?

das*_*ght 18

主要区别在于策略模式封装了一组相关行为,而访客模式封装了多个这样的组.

  • 您应该使用的策略模式,当你需要封装行为 -如果你有一个家庭的算法,你需要在运行时它们之间选择,你应该使用策略模式.这很常见:每次编程到接口时都会发生这种情况.
  • 您应该使用访问者模式来实现双重调度 - 如果您有一组算法需要与多个对象相关的虚拟.这远不常见,部分原因是它实施起来要困难得多.

  • +1,您可以通过示例获得更多详细信息,但这是一个很好的令人讨厌的简洁答案. (2认同)

Rav*_*abu 5

访问者模式意图:

表示要对对象结构的元素执行的操作。访问者允许您定义新操作,而无需更改其操作的元素的类。

在以下情况下使用访问者模式:

  1. 必须对组合在结构中的不同类型的对象执行类似的操作
  2. 您需要执行许多不同且不相关的操作。它将操作与对象结构分开
  3. 必须在不改变对象结构的情况下添加新操作
  4. 将相关操作集中到一个类中,而不是强迫您更改或派生类
  5. 将函数添加到您没有源或无法更改源的类库

尽管访问者模式提供了在不更改 Object 中现有代码的情况下添加新操作的灵活性,但这种灵活性也带来了一个缺点。

如果添加了新的 Visitable 对象,则需要更改 Visitor 和 ConcreteVisitor 类中的代码。有一个解决这个问题的方法:使用反射,这会对性能产生影响。

有关更多详细信息,请参阅oodesign 文章sourcemaking文章

策略模式意图:

定义一系列算法,封装每个算法,并使它们可以互换。策略让算法独立于使用它的客户端而变化。

策略可以让你改变一个对象的内脏。

有关更多详细信息,请参阅以下 SE 问题:

策略模式的真实世界示例


Vik*_*dor 3

访问者模式用于遍历对象层次结构并提供一些功能,例如打印或报告等,我使用它来提供不同的格式(文本/HTML),通过编写多个访问者(每种格式一个)来打印对象层次结构。层次结构中的对象是可访问的。

策略模式用于根据输入选择特定的逻辑路径。一个典型的示例是身份验证过滤器,其中根据AuthorizationHTTP 标头中的值,选择并运行不同的身份验证策略(例如 NTLM/Negotiate/Basic)。过滤器将保存对 AuthenticationStrategy 接口的引用,根据传入的请求,选择特定的身份验证策略并将其分配给该引用,并且后面的代码不需要知道所使用的确切策略。