聚合、组合和依赖关系有什么区别?
聚合 意味着一种父子关系,其中子级可以独立于父级存在。例如:班级(父级)和学生(子级)。删除班级后,学生仍然存在。
组合 意味着子级不能独立于父级存在。例如:房屋(父级)和房间(子级)。房间不存在于房屋之外。
以上两种属于包含关系(因此是父子关系)。
依赖关系 是一种较弱的关系,代码术语中表示一个类通过参数或返回类型使用另一个类。
依赖是一种关联关系。
聚合和组合基本上完全相同,唯一的区别是当子元素的生命周期完全受父元素控制时,使用组合。
聚合
Car -> Tires
Tires
可以从Car
对象上拆下来并安装在另一个车上。此外,如果汽车被撞毁,轮胎不一定要被销毁。
组合
Body -> Blood Cell
当Body
对象被销毁时,BloodCells
也会随之销毁。
依赖关系
两个对象之间的关系,更改其中一个可能会影响另一个。聚合 - 由不同部分组成的整体,每个部分都有自己的身份,独立于其所属的整体。您可以选择该部分并将其移动到另一个对象中。(现实世界的例子:轮子->汽车,血细胞->身体)
组合 - 整体不可分割的部分。您无法将此部分移动到另一个对象中,更像一种属性。(现实世界的例子:曲线->道路,个性->人物,最大速度->汽车,对象的属性->对象)
请注意,一个在一个设计中是聚合关系,在另一个设计中可能是组合关系。这完全取决于特定设计中如何使用关系。
依赖 - 容易受到变化的影响。(雨量->天气,头部位置->身体姿势)
注:“Bloodcell”->“Blood” 可以被视为“组合”,因为没有名为“血液”的实体,血细胞无法存在。“Blood”->“Body”可能是“聚合”,因为血液可以存在而无需名为“身体”的实体。
与组合关系相关联的对象将不会存在于包含对象之外。例如,预约和所有者(人员)或日历;测试结果和患者。
另一方面,被包含对象聚合在包含对象中,但可以存在于该包含对象之外。例如,门和房屋;员工和部门。
依赖关系涉及到协作或委托,其中一个对象请求另一个对象的服务,并因此依赖于该对象。作为服务的客户端,您希望服务接口保持不变,即使未来提供了其他服务。
一个对象可能作为其属性的一部分包含另一个对象。
因此,包含关系不一定是物理上的。例如,计算机系统有保修。
包含:- 在这里,我们必须使用外部对象才能访问内部对象。我们可以重复使用所包含的对象。 聚合:- 在这里,我们可以无需使用外部对象多次访问内部对象。