设计模式:复合与组合

时间:2012-01-30 21:32:43

标签: design-patterns composite composition

我正在完成一个关于设计模式的课程,虽然审阅这些笔记时遇到了我在学期中遗漏的一些内容:复合撰写。我设法理解的是复合是指一个对象实际上封装了整个对象,而复合是指它只保存指向它们的指针。

  1. 这是对的吗?有人可以向我解释一下这个吗?
  2. 我什么时候比较喜欢一个?

1 个答案:

答案 0 :(得分:48)

Composition

这是一个设计概念(不是真正的模式)。当您想要描述包含另一个对象的一个​​对象时,将使用此术语。它经常在Composition over inheritance讨论中发生。

此外,构成意味着强大的所有权。一个对象拥有(即管理生命周期)另一个对象。当父母被摧毁时,所有孩子也被摧毁。如果没有这种强烈的关系(孩子可以比父母长寿),我们谈的是聚合

引用great example in Wikipedia

  

例如,大学拥有各个部门(例如,化学),每个部门都有许多教授。如果大学关闭,部门将不复存在,但这些部门的教授将继续存在。因此,大学可以看作是部门的组合,而部门则有教授的集合。此外,教授可以在多个部门工作,但一个部门不能成为一所以上大学的一部分。

因此,您可以看到您应该根据所有权关系的类型在组合或聚合之间进行选择。

Composite pattern

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

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

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