Viv*_*ere 4 inheritance uml design-patterns composition
我正在学习桥梁设计模式。去引用:
\n\n\n桥接模式试图通过从继承切换到对象来解决这个问题
\ncomposition。\xe2\x80\xa6
然后,显示下图:
\n\n当人们谈论组合作为继承的替代方案时,他们是否指的是聚合关系和组合关系?如果不是,它们到底是什么意思?
\n我想知道这一点,因为图片 和 之间是聚合关系,而不是合成关系。ColorShape
这是术语上的歧义。几乎所有有关桥接模式的文章都直接受到 首先定义此设计模式的四人帮 (GoF)的启发。这就是歧义的原因:
他们使用术语组合来表示对象组合而不是 UML 组合。
在他们写书时,UML 尚未定义。他们的图形符号使用空心菱形,其含义与 UML 不同。
他们首先提到组合而不是继承,其含义是对象组合而不是类继承。
对象组合是 OOP 技术,旨在通过组装更简单的对象来创建更复杂的对象。本书第 19 页对其进行了定义:
在这里,新的功能是通过组装或组合对象来获得更复杂的功能。对象组合要求所组合的对象具有明确定义的接口。这种重用方式称为黑盒重用,因为对象的内部细节不可见。
在 UML 中,该技术对应于关联、共享聚合或 UML 组合的实现。但与 UML 组合不同,它并不意味着排他所有权或生命周期管理。
书中使用的类图的图形表示法看起来非常像UML。这是因为它基于OMT(UML 的前身)。但符号的使用略有不同,您可以在 GoF 第 364 页上看到:
表示部分或聚合关系的对象引用由底部带有菱形的箭头线表示。
在 UML 中,组合(黑色菱形)将符合此定义。但 UML 组合增加了更多要求,例如组件生命周期的排他所有权和责任。这比对象组合和基于引用的聚合更具限制性。
在 UML 中,共享聚合(空心菱形)或什至简单关联(无菱形)也将完全符合此定义,请记住 UML 并未定义共享聚合的语义。
据我所知,GoF 是第一个推荐组合而不是继承的人。在他们的开创性工作的第 20 页,他们做出了以下非常精确的声明(由我强调):
优先考虑对象组合而不是类继承
我们都喜欢简短的咒语。因此,在没有“对象”和“类”的情况下,它很快就被接管了。
每当人们谈论 GoF 模式时,您都会面临聚合或组合符号可能不准确的风险,并且组合可能有多种含义。因此,您需要以批判性思维和开放的心态来阅读它。由于模式不是神奇的食谱,并且可能无论如何都需要适应您自己的限制,因此这种心态只会对您有利;-)