Java中聚合和组合的实现区别

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()
    {

    }
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值