设计模式:组合模式 vs 组成模式

39

我正在完成一个关于设计模式的课程,在复习笔记时注意到了本学期漏掉的内容:组合(Composite)组成(Composition)。我理解的是,组合是指一个对象实际封装了整个对象,而组成是指它仅持有指向这些对象的指针。

  1. 这是正确的吗?有人能更好地解释一下吗?
  2. 在什么情况下我会更喜欢使用其中之一?
1个回答

75

组合

这是一个设计概念(不是真正的模式)。当您想要描述一个对象包含另一个对象时,使用此术语。在组合优于继承讨论中,这种情况经常发生。

此外,组合意味着强烈的所有权。一个对象拥有(即管理生命周期)另一个对象。当父对象被销毁时,所有子对象也将被销毁。如果没有这样强烈的关系(子对象可以比父对象存在更长时间),我们谈论的是聚合

引用维基百科中的一个很好的例子

举个例子,大学拥有各种系(比如化学),每个系都有若干教授。如果大学关闭,这些系将不存在,但是那些系里的教授仍然存在。因此,大学可以被看作是系的组合,而系则具有教授的聚合。此外,一个教授可以在多个系中工作,但是一个系不能成为多个大学的一部分。

所以,正如你所看到的,根据所有权关系的类型,您应该在组合和聚合之间进行选择。

组合模式

这是GoF设计模式,描述了父子强关系,其中子节点可以是简单节点或其他节点的容器(可能包含其他子节点)。

它在GUI和类似树状结构中非常常见。例如,在Java Swing中,JPanel可以容纳各种控件,如文本字段、标签、列表等,但它也可以容纳其他的JPanel,这些面板又可以包含简单的组件甚至更多嵌套的面板。

通常,组合设计模式使用组合,但在某些情况下,父级不必拥有所有子项。继续GUI示例,您可以将一个面板取出并移动到另一个位置(更改父级)。

1
+1 是为了解释这两点,但OP似乎也需要关于容器和仅有指针问题的帮助。 - Matt Fenwick
@MattFenwick:没错,我添加了一些澄清和引用(还涉及聚合)。 - Tomasz Nurkiewicz
6
@baruch:不用客气。所以你一直在上设计模式课程,却不知道Gang of Four是谁? :-) - Tomasz Nurkiewicz
2
@baruch:GoF 指的是经典的《设计模式》一书的作者(Gamma、Helm、Johnson、Vlissides)。 - ybakos
1
嗨@TomaszNurkiewicz,我知道这很老,但这是黄金... 感谢您的解释,无论如何,我有关于“设计概念”的问题,还有哪些其他可用的设计概念?我已经尝试在Google上搜索了一下,但没有找到任何信息。谢谢。 - kilua

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