【问题标题】:Difference between Vistor pattern and Stategy pattern?访客模式和策略模式的区别?
【发布时间】:2013-01-18 22:08:12
【问题描述】:

我在 http://en.wikipedia.org/wiki/Visitor_pattern

对这种模式的初步理解给人的印象是访问者模式与桥/策略模式相同。

那么这个具体的例子是否会产生这样的印象?有人可以解释其中的区别吗?可能在 Java 中有明确的例子?

【问题讨论】:

  • 可以移到programmers.stackexchange.com
  • 我也从来没有完全理解其中的区别;我认为这不值得投反对票——而且,如果你要投反对票,也请投一个近距离投票。 (不幸的是,在处理“企业代码”时,理解大量命名的“模式”似乎是一个“实际要求”。)
  • 总之,当你在学习DP的时候,首先你需要知道的是“这个DP在解决什么问题”。访问者和策略正在解决根本不同的问题(在没有调用者意识的​​情况下更改实现 VS 使用提供的算法处理对象结构)。虽然结果可能看起来相似,但它们本质上是不同的,您可以通过使用方式看到差异。
  • @Ray 考虑“en.wikipedia.org/wiki/Visitor_pattern”中的示例正如您所引用的“Visitor 允许您在不更改其操作的元素的类的情况下定义新操作。”。你的意思是访问者接口有访问()方法。现在您可以添加 visit2()、visit3() 等方法,而无需更改 CarElement 子项,即它运行的类?我对么 ?但是谁会在不改变 accept() 方法的情况下调用这些新方法。

标签: java design-patterns strategy-pattern visitor-pattern bridge


【解决方案1】:

桥:

Bridge 将抽象与实现分离。抽象和实现都可以独立变化。

  1. 创建桥实现接口
  2. 创建具体的桥梁实现类
  3. 创建一个包含接口的抽象类(这里的关键是组合)
  4. 创建实现抽象类的具体类

如果您正在寻找示例,请查看tutorialspoint 文章。

访客:

Visitor 允许您定义一个新操作,而无需更改它所操作的元素的类。

来自 GOF 的定义:

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

实施过程如下。

  1. 创建一个Visitor 类层次结构,该层次结构在抽象基类中为聚合节点层次结构中的每个具体派生类定义一个纯虚拟visit() 方法。
  2. 每个visit() 方法都接受一个参数 - 一个指向原始 Element 派生类的指针或引用。
  3. 要支持的每个操作都使用Visitor 层次结构的具体派生类建模。在访问者基类中声明的visit() 方法现在在每个派生子类中定义,方法是将原始实现中的“类型查询和转换”代码分配给适当的重载 visit() 方法。
  4. 向 Element 层次结构的基类添加一个纯虚拟 accept() 方法

对于工作 java 代码,请查看教程点文章和dzone 文章。

策略:

策略允许在运行时动态地从一种算法切换到另一种算法(来自一系列算法)

查看这个 SE 问题了解更多详情。

Real World Example of the Strategy Pattern

【讨论】:

    【解决方案2】:

    从 GOF 书中,意图非常不同:

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

    桥 - 对象结构 - 将抽象与其实现分离,以便两者可以独立变化。

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

    周围有很多 Java 示例。

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2010-11-16
      • 1970-01-01
      • 2010-10-11
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2010-10-14
      相关资源
      最近更新 更多