3

我没有看到任何区别。看起来两个模式都在尝试组合对象。谁能解释这两种模式背后的意图?

4

3 回答 3

9

这些图案完全不同!首先Composite是一种结构模式,也就是说它是用来构建数据结构的。访客行为模式,负责关系和行为。

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

访问者用于模拟虚拟调用以避免instanceof类似结构。请参阅“instanceof”运算符的这种使用是否被认为是糟糕的设计?完整的例子。访问者可以与Composite一起使用- 就像上面的示例一样,如果Item定义accept(ItemVisitor visitor)方法,您可以遍历树。

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

于 2012-06-28T07:33:57.300 回答
8

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

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

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

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

于 2012-06-28T11:29:42.483 回答
1

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

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

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

于 2012-06-28T07:37:38.480 回答