【问题标题】:Difference between Visitor and Composite Pattern?访问者模式和复合模式之间的区别?
【发布时间】:2012-06-28 19:29:42
【问题描述】:

我看不出有什么不同。看起来两个模式都在尝试组合对象。谁能解释这两种模式背后的意图?

【问题讨论】:

  • 你至少搜索过“访客模式”和“复合模式”吗?两者都指向维基百科上的完整解释页面。

标签: design-patterns


【解决方案1】:

这些模式完全不同!首先Composite是一个structural patterns,表示它是用来构建数据结构的。 访客behavioral pattern,负责关系和行为。

为了进一步解释,您使用Composite 来构建对象树,其中所有项目都是T 的子类型。然而,T(某种容器)的一个子类可以包含子类Ts 的集合。考虑一个类Item,而不是有两个子类:ProductBoxBox 可以进一步保存Items 的集合,无论是产品还是盒子。这些嵌套的盒子可以容纳更多的项目,因此我们正在有效地构建一个树状结构。

Visitor 用于模拟虚拟调用以避免类似instanceof 的结构。有关完整示例,请参阅Is This Use of the "instanceof" Operator Considered Bad Design?Visitor 可以与 Composite 一起使用 - 就像上面的示例一样,如果 Item 定义了 accept(ItemVisitor visitor) 方法,则可以遍历树。

我发现这两者之间很难找到任何相似之处。

【讨论】:

    【解决方案2】:

    它们是不同的模式,但经常一起使用。

    复合的重点是将相同的操作应用于共享一个界面的一堆元素。访问者的目的是使用新操作扩展一堆元素,而不更改它们的实现或调用者的实现。因此你经常看到:

    Composite c = new Composite();
    Visitor v = new ConcreteVisitor();
    c.visit(v);
    

    这样,您可以保持组合的实现和组合中的类静态,并且只改变您应用到它们的访问者类型。

    【讨论】:

      【解决方案3】:

      Composite 是一个 Object,它具有一组操作和一个自身的对象容器。容器可能包含也可能不包含对象。对 Composite 执行的操作将在其自身及其包含的所有对象上执行。有些人可能会将其称为一种树。

      访问者是一组在已建立的类层次结构上工作的对象/操作。访问者允许您在层次结构上创建操作,而无需更改层次结构。例如,创建一个对层次结构中的多个对象进行操作(访问)的操作,从而将多个对象的工作组合在一起,而无需更改它们的接口。

      这两种模式确实有很大的不同。

      【讨论】:

        猜你喜欢
        • 2011-09-12
        • 2011-01-15
        • 1970-01-01
        • 2021-08-02
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2017-04-11
        相关资源
        最近更新 更多