我正在完成一个关于设计模式的课程,在复习笔记时注意到了本学期漏掉的内容:组合(Composite)与组成(Composition)。我理解的是,组合是指一个对象实际封装了整个对象,而组成是指它仅持有指向这些对象的指针。
- 这是正确的吗?有人能更好地解释一下吗?
- 在什么情况下我会更喜欢使用其中之一?
我正在完成一个关于设计模式的课程,在复习笔记时注意到了本学期漏掉的内容:组合(Composite)与组成(Composition)。我理解的是,组合是指一个对象实际封装了整个对象,而组成是指它仅持有指向这些对象的指针。
这是一个设计概念(不是真正的模式)。当您想要描述一个对象包含另一个对象时,使用此术语。在组合优于继承讨论中,这种情况经常发生。
此外,组合意味着强烈的所有权。一个对象拥有(即管理生命周期)另一个对象。当父对象被销毁时,所有子对象也将被销毁。如果没有这样强烈的关系(子对象可以比父对象存在更长时间),我们谈论的是聚合。
举个例子,大学拥有各种系(比如化学),每个系都有若干教授。如果大学关闭,这些系将不存在,但是那些系里的教授仍然存在。因此,大学可以被看作是系的组合,而系则具有教授的聚合。此外,一个教授可以在多个系中工作,但是一个系不能成为多个大学的一部分。所以,正如你所看到的,根据所有权关系的类型,您应该在组合和聚合之间进行选择。
这是GoF设计模式,描述了父子强关系,其中子节点可以是简单节点或其他节点的容器(可能包含其他子节点)。
它在GUI和类似树状结构中非常常见。例如,在Java Swing中,JPanel
可以容纳各种控件,如文本字段、标签、列表等,但它也可以容纳其他的JPanel
,这些面板又可以包含简单的组件甚至更多嵌套的面板。