【问题标题】:Design patterns: Composite vs. Composition设计模式:复合与组合
【发布时间】:2012-02-22 16:07:30
【问题描述】:

我正在完成关于设计模式的课程,在复习笔记时发现了我在学期中错过的一些东西:Composite vs. Composition。我设法理解的是,复合是一个对象实际上封装了整个对象,而复合是它只保存指向它们的指针。

  1. 是这样吗?谁能更好地向我解释一下?
  2. 我什么时候更喜欢其中之一?

【问题讨论】:

    标签: design-patterns composite composition


    【解决方案1】:

    Composition

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

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

    引用great example in Wikipedia:

    例如,一所大学拥有多个系(例如化学),每个系都有许多教授。如果大学关闭,这些系将不复存在,但这些系的教授将继续存在。因此,大学可以看作是系的组合,而系是教授的集合体。此外,教授可以在多个系工作,但一个系不能隶属于多个大学。

    如您所见,您应该根据所有权关系的类型在组合或聚合之间进行选择。

    Composite pattern

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

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

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

    【讨论】:

    • +1 用于解释这两者,但 OP also 似乎需要关于包含问题与仅存在指针问题的帮助。
    • @MattFenwick:对,我添加了一些说明和引用(也关于聚合)。
    • @baruch:我很高兴。所以你一直在参加设计模式课程,但你不知道Gang of Four 是谁? :-)
    • @baruch:GoF 指的是规范设计模式书籍(Gamma、Helm、Johnson、Vlissides)的作者。
    • 嗨@TomaszNurkiewicz 我知道这是旧的,但这是金...感谢您的解释,无论如何我对design concept 有疑问,其他可用的设计概念是什么?我试图用谷歌搜索它,找不到任何东西。谢谢