What is the difference between aggregation, composition and dependency?
聚合、组合和依赖之间有什么区别?
聚合意味着子级可以独立于父级存在的关系。例如:班级(家长)和学生(孩子)。删除班级,学生仍然存在。
组合意味着一种关系,其中子项不能独立于父项而存在。例如:房子(父)和房间(子)。房间不与房子分开。
以上两种是包含的形式(因此是父子关系)。
依赖关系是一种较弱的关系形式,用代码术语表示类使用另一个按参数或返回类型。
依赖是一种关联形式。
聚合和组合几乎完全相同,只是在子级的生命完全由父级控制时使用组合。
聚合
1 | Car -> Tires |
组成
1 | Body -> Blood Cell |
号
当
附属国
两个对象之间的关系,其中一个对象的变化可能会影响另一个对象。
聚合-可分离部分到整体。这部分有它自己的身份,与它所属的部分是分开的。您可以选择该部分并将其移动到另一个对象。(现实世界的例子:车轮->汽车,血细胞->身体)
组成-整体不可分离的部分。不能将零件移动到其他对象。更像是一种财产。(现实世界示例:曲线->道路、个性->人、最大速度->汽车、对象属性->对象)
请注意,在一种设计中作为集合的关系可以是另一种设计中的组合。这就是在具体设计中如何使用这种关系。
依赖-对变化敏感。(雨量->天气,头部位置->身体位置)
注:"血细胞"->血"可能是"成分",因为血细胞不可能没有被称为血的实体而存在。血液"->body"可以是"聚集",因为血液可以不存在称为body的实体而存在。
与组合关系关联的对象将不存在于包含对象之外。例如预约和所有者(一个人)或日历;测试结果和患者。
另一方面,由包含对象聚合的对象可以存在于包含对象之外。例如门和房子;员工和部门。
依赖关系与协作或委托相关,其中一个对象从另一个对象请求服务,因此依赖于该对象。作为服务的客户机,您希望服务接口保持不变,即使将来提供了服务。
聚合和组合是面向对象世界中大多数人通过UML获得的术语。而UML在定义这些术语方面做得很差,如亨德森·塞勒斯和巴比尔所证明的那样("这是什么叫做聚合?""统一建模语言中整体零件关系的形式化")。我认为,如果您对UML兼容感兴趣,就不能给出聚合和组合的一致定义。我建议你看看引用的作品。
关于依赖性,这是类型(而不是对象)之间高度抽象的关系,几乎可以表示任何东西。
一个对象可以包含另一个对象作为其属性的一部分。
所以遏制不需要是物理的。例如,计算机系统有保修。
包容:这里要访问内部对象,我们必须使用外部对象。我们可以重用包含的对象。聚合:在这里,我们可以一次又一次地访问内部对象,而不使用外部对象。