游客模式和组合模式有什么区别?

3

我没有看到任何区别。似乎这两种模式都试图组合对象。有人能解释一下这两个模式背后的意图吗?


2
你是否至少Google过“访问者模式”和“组合模式”?这两个关键词都会带你跳转到维基百科的完整解释页面。 - JB Nizet
3个回答

10
这些模式完全不同!首先,组合模式是一种结构型模式,意味着它用于构建数据结构。而访问者模式是一种行为型模式,负责关系和行为。
更进一步地解释一下,你使用组合模式来构建对象树,其中所有项目都是T的子类型。然而,T的一个子类(类似容器)可以保存子T的集合。想象一个类Item,它有两个子类:ProductBoxBox还可以保存Item的集合,包括产品或盒子。这些嵌套的盒子甚至可以再保存更多的物品,因此我们实际上正在构建一种类似树的结构。 访问者模式用于模拟虚拟调用以避免类似instanceof的结构。请参见这个例子访问者模式可以与组合模式一起使用,就像上面的例子中,如果Item定义了accept(ItemVisitor visitor)方法,则可以遍历树。
我发现这两者之间很难看到任何相似之处。

8

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

组合模式的重点是将相同的操作应用于共享接口的一组元素。访问者模式的重点是在不改变实现或调用方实现的情况下,为一组元素扩展新操作。因此,您经常会看到:

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

这样,您可以保持组合实现和组合中的类的静态性,并仅变化应用于它们的Visitor类型。


1

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

访问者是一组对象/操作,用于处理已建立的类层次结构。访问者允许您在不必更改层次结构的情况下创建对层次结构的操作。例如,可以创建一个操作来访问层次结构中的多个对象,从而将多个对象的工作组合在一起,而无需更改它们的接口。

这两种模式确实非常不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接