组合,关联,聚合的区别

聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。

组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。

聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。 
我想举个通俗的例子。
你和你的心脏之间是composition关系(心脏只属于你自己)
你和你买的书之间是aggregation关系(书可能是别人的)
你和你的朋友之间是association关系
在面向对象编程中,关联聚合组合是三种不同的对象关系,而继承则是类之间的关系。它们之间有以下区别: ### 1. 关联(Association) 关联是指两个或多个类之间的关系,这些类之间可以相互通信。关联可以是单向的或双向的,关系的强度可以从弱到强不等。 例如: ```java class Teacher { private List<Student> students; public void addStudent(Student student) { students.add(student); } } class Student { private Teacher teacher; public void setTeacher(Teacher teacher) { this.teacher = teacher; } } ``` 在这个例子中,`Teacher`类`Student`类之间存在关联关系。 ### 2. 聚合(Aggregation) 聚合是一种特殊的关联关系,表示“整体与部分”的关系,但部分可以独立于整体存在。聚合关系通常使用空心菱形来表示。 例如: ```java class Department { private List<Employee> employees; public Department() { employees = new ArrayList<>(); } public void addEmployee(Employee employee) { employees.add(employee); } } class Employee { private String name; public Employee(String name) { this.name = name; } } ``` 在这个例子中,`Department`类`Employee`类之间存在聚合关系。一个`Employee`可以属于多个`Department`,也可以独立存在。 ### 3. 组合(Composition) 组合是一种更强的聚合关系,表示“整体与部分”的关系,但部分不能独立于整体存在。组合关系通常使用实心菱形来表示。 例如: ```java class Car { private Engine engine; public Car() { engine = new Engine(); } } class Engine { private String type; public Engine() { this.type = "V8"; } } ``` 在这个例子中,`Car`类`Engine`类之间存在组合关系。一个`Engine`不能独立于`Car`存在。 ### 4. 继承(Inheritance) 继承是一种类之间的关系,表示“is-a”关系。子类继承父类的属性方法,并可以添加新的属性方法或重写父类的方法。 例如: ```java class Animal { public void eat() { System.out.println("Animal eats"); } } class Dog extends Animal { public void bark() { System.out.println("Dog barks"); } } ``` 在这个例子中,`Dog`类继承自`Animal`类,`Dog`类可以使用`Animal`类的`eat`方法,并可以添加自己的`bark`方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值