组合在组合与继承辩论中意味着什么?

What does composition mean in the composition vs inheritance debate?

我正在了解 Bridge Design pattern。引用:

The Bridge pattern attempts to solve this problem by switching from inheritance to the object composition. …

然后,显示如下图:

当人们谈论组合作为继承的替代方案时,他们指的是 聚合组合 关系吗?如果不是,它们到底是什么意思?

我想知道这是因为图片在Color和[=12=之间有聚合关系,而不是合成 ] 一个.

通常,当人们谈论使用组合与继承时,他们指的是解决同一问题的替代方法。在这两种情况下,“base class”提供了一个接口的实现,您希望在“derived class”

中重用该接口

当您通过继承实现它时​​,在派生 class 和基础 class 之间存在不希望的 is-a 关系,其效果是基础 class,本来应该隐藏的,在派生中可以变成变化class class.

当你用组合来实现这个——一个真正的组合关系——“派生”只与它想要实现的接口有一个 is-a 关系,而这样做的代价是它必须将呼叫委托给“基地”class.

在您引用的桥接模式中,目标略有不同。您 do 想要将包含 class 与连接实现的更改隔离开来,但是包含 class 和接口之间没有 is-a 关系包含的 class.

它们之间的关系可能是组合关系,也可能是简单的聚合——这是一个实现细节。通常,包含的 class 的具体实现将作为接口注入到包含 class 的构造函数中,在这种情况下,关系只是聚合。

当人们谈论组合作为继承的替代方案时,我不能说“人们”指的是什么,所以我会为自己说话。

我认为组合(实心菱形)和共享聚合(空心菱形)都有效,但在大多数情况下首选组合。

共享聚合意味着允许一个Color实例被多个Shape实例聚合。这是有效的,因为例如可能有多个红色形状,并且这些形状没有理由拥有自己的红色副本。

然而,在实践中,组件将具有自己的属性。例如,class 颜色可能具有属性 'brightness'。现在,如果 Red 的一个实例被多个 Shapes 共享,并且其中一个 Shapes 改变了它的亮度,那么所有其他红色形状的亮度也会改变。这通常是不可取的。在这种情况下,组合是首选。

简而言之

这是一个术语歧义。几乎所有关于桥接模式的文章都直接受到第一个定义此设计模式的 Gang of Four (GoF) 的启发。这就是歧义的原因:

  • 他们使用术语组合表示object composition 而不是 UML 组合。

  • 在他们写书的时候,UML 还没有定义。他们的图形符号使用空心菱​​形,其含义与 UML 不同。

  • 他们最先提到composition over inheritance,意思是对象组合而不是class inheritance

更多详情

GoF的对象组合不是UML组合

对象组合是OOP技术,旨在通过组装更简单的对象来制造更复杂的对象。它在本书的第 19 页上定义:

Here, new functionality is obtained by assembling or composing objects to get more complex functionality. Object composition requires that the objects being composed have well-defined interfaces. This style of reuse is called black-box reuse, because no internal details of the objects are visible.

在 UML 中,此技术对应于关联、共享聚合或 UML 组合的实现。但与 UML 组合不同,它并不意味着独占所有权或生命周期管理。

GoF 图形符号不是 UML

书中使用的class图的图形符号看起来很像UML。这是因为它基于 OMT,UML 的前身。但是在符号的使用上略有不同,您可以在 GoF 的第 364 页上阅读:

An object reference representing a part-of or aggregation relationship is indicated by an arrowheadded line with a diamond at its base.

在 UML 中,组合(黑色菱形)将匹配此定义。但是 UML-composition 增加了更多要求,例如对组件生命周期的独占所有权和责任。这比对象组合和 reference-based 聚合更具限制性。

在 UML 中,共享聚合(空心菱形)或什至简单关联(无菱形)也可以完美匹配此定义,请记住 UML 未定义共享聚合的语义。

组合优于继承

据我所知,GoF 是第一个推荐组合而不是继承的人。他们在开创性工作的第 20 页做出了以下非常精确的陈述(由我突出显示):

Favor object composition over class inheritance

我们都喜欢简短的咒语。因此,这很快就被接管了,没有“对象”和“class”。

结论

每当人们谈论 GoF 模式时,您都会面临聚合或组合符号可能不准确的风险,并且该组合可能有多种含义。因此,您需要以批判性思维和开放的心态阅读它。由于模式不是神奇的食谱,并且可能无论如何都需要适应您自己的限制,这种心态只会对您有利;-)