Java中聚合和组合的实现区别
一、组合和聚合的含义
1.组合
组合是一种受限制的聚合形式,代表了part-of关系;其中的两个实体(或者类)是高度依赖于彼此的。
例如:人类和心脏,人类需要心脏来生存,心脏也需要人体才能生存。
public class Person {
private Eye eye = new Eye(); //一个人有鼻子有眼睛
private Nose nose = new Nose();
// ....
}
组合同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如人的头(Head)和嘴巴(Mouth)、鼻子(Nose),嘴巴和鼻子是头的组成部分之一,一旦头没了,嘴巴也没了,因此头和嘴巴、鼻子是组合关系。
2.聚合
聚合是一种特殊的关联形式,代表了has-a关系;它是类(或实体)之间的一种单向关系。
例如:钱包和钱,钱包会有钱,钱里面不会包含钱包;这是一种天生的单向关系。
在聚合的关系中,两种类(或实体)是可以单独存在的,不会相互影响;也就是说:一个类(或实体)的是否存在不会影响与之聚合的其他类的存在与否。
public class Family {
private List<Child> children; //一个家庭里有许多孩子
// ...
}
在代码层面,聚合和关联关系是一致的,只能从语义级别来区分。普通的关联关系中,a类和b类没有必然的联系,而聚合中,需要b类是a类的一部分,是一种”has-a“的关系,即 a has-a b; 比如家庭有孩子,屋子里有空调。
但是,has 不是 must has,a可以有b,也可以没有。a是整体,b是部分,整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
二、聚合和组合的区别:
聚合和组合的区别是:
聚合代表了has-a关系,一种单向关系;聚合中的两种类(或实体)是可以单独存在的,不会相互影响。
组合代表了part-of关系,组合中的两个实体(或者类)是高度依赖于彼此的,它们之间会相互影响。
1、依赖性区别
聚合中的两种类(或实体)是可以单独存在的,不会相互影响;被关联的一方可以独立于关联一方,依赖性不强。相反,组合中的两个实体(或者类)是高度依赖于彼此的,它们之间会相互影响。
2、关系类型的区别
聚合代表了has-a关系,一种单向关系;组合代表了part-of关系。
3、关联强度的不同
聚合是一种弱关联关系;组合是一种强关联关系。
4、生命周期的不同
在聚合关系中的两个类(或实体)的生命周期是不同步;但,在组合关系中的两个类(或实体)的生命周期是同步的。
三、Java中聚合和组合的实现区别
1.组合
public class Mouth
{
}
public class Nose
{
}
public class Head
{
private Mouth mouth;
private Nose nose;
public Head()
{
mouth = new Mouth();
nose = new Nose();
}
public void shake()
{
}
}
2.聚合
public class Engine
{
}
public class Wheel
{
}
public class Light
{
}
public class Car
{
private Engine engine;
private Light light;
private Wheel wheel;
public Car(Engine engine, Light light, Wheel wheel)
{
super();
this.engine = engine;
this.light = light;
this.wheel = wheel;
}
public void drive()
{
}
}