访客和复合模式之间的区别?

时间:2012-06-28 07:30:50

标签: design-patterns

我没有看到任何差异。看起来两个模式都在尝试组合对象。任何人都可以解释这两种模式背后的意图吗?

3 个答案:

答案 0 :(得分:8)

这些模式完全不同!首先, Composite structural patterns,这意味着它用于构建数据结构。 访客behavioral pattern,负责关系和行为。

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

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

我发现很难看出这两者之间有任何相似之处。

答案 1 :(得分:6)

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

复合的要点是将相同的操作应用于共享接口的一堆元素。访问者的观点是使用新操作扩展一堆元素,而不改变其实现或调用者的实现。因此,您经常会看到:

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

通过这种方式,您可以保持复合的实现和复合中的类静态,并且只会改变您应用于它们的访问者类型。

答案 2 :(得分:1)

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

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

这两种模式确实完全不同。