我没有看到任何区别。似乎这两种模式都试图组合对象。有人能解释一下这两个模式背后的意图吗?
我没有看到任何区别。似乎这两种模式都试图组合对象。有人能解释一下这两个模式背后的意图吗?
T
的子类型。然而,T
的一个子类(类似容器)可以保存子T
的集合。想象一个类Item
,它有两个子类:Product
和Box
。Box
还可以保存Item
的集合,包括产品或盒子。这些嵌套的盒子甚至可以再保存更多的物品,因此我们实际上正在构建一种类似树的结构。
访问者模式用于模拟虚拟调用以避免类似instanceof
的结构。请参见这个例子。访问者模式可以与组合模式一起使用,就像上面的例子中,如果Item
定义了accept(ItemVisitor visitor)
方法,则可以遍历树。它们是不同的模式,但经常一起使用。
组合模式的重点是将相同的操作应用于共享接口的一组元素。访问者模式的重点是在不改变实现或调用方实现的情况下,为一组元素扩展新操作。因此,您经常会看到:
Composite c = new Composite();
Visitor v = new ConcreteVisitor();
c.visit(v);
这样,您可以保持组合实现和组合中的类的静态性,并仅变化应用于它们的Visitor类型。
Composite是一个对象,它具有一组操作和一个包含自身对象的容器。容器可能包含或不包含对象。对Composite执行的操作将在其自身和所有包含的对象上执行。有些人可能将其称为一种树形结构。
访问者是一组对象/操作,用于处理已建立的类层次结构。访问者允许您在不必更改层次结构的情况下创建对层次结构的操作。例如,可以创建一个操作来访问层次结构中的多个对象,从而将多个对象的工作组合在一起,而无需更改它们的接口。
这两种模式确实非常不同。