一、概念
聚合与组合都是一种关联关系,只是额外具有整体-部分的意义。
组合:Composition
contains-a关系。
通俗来讲就是,一样东西由另一些小的“零部件”组成。比如,一辆汽车是由发动机等零部件组成的,汽车包含了这些零部件。
优点:
1.不破坏封装,整体类与局部类之间松耦合,彼此相对独立。
2.具有较好的可扩展性。
3.支持动态组合。在运行时,整体对象可以选择不同类型的局部对象。
4.整体类可以对局部类进行包装,封装局部类的接口,提供新的接口。
缺点:
1.整体类不能自动获得和局部类同样的接口。
2.创建整体类的对象时,需要创建所有局部类的对象。
聚合:Aggregation
has-a关系。
一种东西本身就有其独立存在的意义,不受约束但属于某一样东西,比如,一个人有一辆车,车是属于人的,但是离开了人车还是车,依旧可以存在。
区别:
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
二、举例
// An example
class People{
String name; //人的名字属性
String body; //人的身体属性
//省略getter、setter方法
}
class name{
String first-name; //人的名属性
String last-name; //人的姓属性
}
class body{
String head; //人的头属性
String hand; //人的手属性
}
人由身体所组成,应该由身体来组合为一个人,身体作为人的组合的一部分。体现在数据存储时,即不必将身体(body)存储在数据库中,而是直接作为人的属性存在。
而name,记录着一个人的名字信息,脱离People之后,可能会有别的地方依旧会使用到该属性。因此这个就是聚合,在设计实体类时,直接保存其ID即可。