关联(Association), 聚合(Aggregation), 组合(Composition) 在软件设计模式中的区别

news/2025/4/1 18:29:00/文章来源:https://www.cnblogs.com/bruce1992/p/18795545

 

关联(Association)、聚合(Aggregation)与组合(Composition)的区别

这三种关系都是面向对象设计中描述类之间关系的重要概念,它们在耦合强度、生命周期管理等方面有显著差异。

1. 关联(Association)

基本特征

  • 最通用的关系类型,表示类之间的使用关系

  • 可以是单向或双向的

  • 关联对象有各自独立的生命周期

  • 通过成员变量实现

代码示例

java
Copy
class Teacher {private List<Student> students; // 教师关联多个学生public void addStudent(Student s) {students.add(s);}
}class Student {// 可以没有对Teacher的引用(单向关联)// 也可以有(双向关联)
}

现实比喻
医生和患者的关系 - 医生认识患者,患者也认识医生,但两者可以独立存在

2. 聚合(Aggregation)

基本特征

  • 一种特殊的关联关系,表示**"has-a"**关系

  • 整体与部分的关系,但部分可以独立于整体存在

  • 空心菱形箭头表示( UML图中 )

  • 生命周期不绑定

代码示例

java
Copy
class Department {private List<Professor> professors; // 系包含教授public void addProfessor(Professor p) {professors.add(p);}
}class Professor {// 可以独立于Department存在
}

现实比喻
汽车和车轮的关系 - 车轮属于汽车,但车轮也可以被拆卸后单独存在

3. 组合(Composition)

基本特征

  • 最强的关联形式,表示**严格的"part-of"**关系

  • 部分不能独立于整体存在

  • 实心菱形箭头表示( UML图中 )

  • 生命周期完全绑定

代码示例

java
Copy
class House {private Room livingRoom; // 组合关系private Room kitchen;public House() {this.livingRoom = new Room(); // 房间随房子创建this.kitchen = new Room();    // 房间不能独立于房子存在}
}class Room {// 不能独立于House存在
}

现实比喻
人体和心脏的关系 - 心脏不能独立于人体存在

三者的关键区别对比

特性关联(Association)聚合(Aggregation)组合(Composition)
关系强度 中等
生命周期 独立 部分独立于整体 部分依赖整体
UML表示 普通箭头 空心菱形箭头 实心菱形箭头
能否共享 能(部分可属于多个整体) 不能
典型实现 成员变量 集合类型的成员变量 直接实例化成员对象
删除整体影响 不影响部分 不影响部分 部分会被一起删除
示例 医生-患者 汽车-车轮 房子-房间

设计选择建议

  1. 使用关联当:

    • 对象需要与其他对象协作

    • 关系是临时的或可变的

    • 对象生命周期独立

  2. 使用聚合当:

    • 需要表示"包含"但部分可独立存在

    • 部分对象可能被多个整体共享

    • 整体负责管理部分但不创建它们

  3. 使用组合当:

    • 部分对象没有独立存在的意义

    • 整体完全控制部分的生命周期

    • 需要强封装性,部分不应暴露给外部

记忆技巧

  • 关联:"认识"关系(A知道B存在)

  • 聚合:"拥有"关系(A包含B,但B可以没有A)

  • 组合:"由...组成"关系(A由B构成,B不能没有A)

理解这些差异有助于在软件设计中做出更合理的架构决策,特别是在领域模型设计和系统模块划分时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906595.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H7-TOOL固件2.28发布,CAN, UART和RTT三合一同时收发且实时记录,脱机烧录新增革命性一键添加新芯片功能,新增多脱机芯片支持

H7-TOOL详细介绍(含操作手册): http://www.armbbs.cn/forum.php?mod=viewthread&tid=89934H7-TOOL PLUS电池版无需升级,预装的已经是最新的2.28版。后面还有个PLUS电池板低功耗运行模式,后续也将上线。【PC软件】V2.2.8 1. 脱机烧录功能更新:- 新增MAGTRON(巨磁智能)…

gitlab+jenkins+harbor+k8s安装操作流程之java项目打包成docker镜像

介绍在Java项目打包成Docker镜像时,通常需要写Dockerfile。Dockerfile是用来构建Docker镜像的文本文件,它包括了构建Docker镜像所需的所有命令和步骤 首先Maven先构建jar包 注意:dockerfile各个参数的解释如下

使用gradio生成图文理解界面

这里通过gradio来生成1个图文理解的界面,通过上传一张图片,则生成相应文本描述,即望图生义。 import gradiodef summarize(raw_image):model = xxxx()inputs = model.generate(raw_image)return tokenizer.decode(inputs)demo = gradio.Interface(fn=summarize,title="望图…

centos7 yum安装使用时提示Cannot find a valid baseurl for repo: base/7/x86_64

机器解析不了yum源,一般有三种原因: 1、无法上网,请检查网络ping www.baidu.com ping不通,机子没网,检查网络配置。能ping通检查第二种情况2、DNS配置有问题nslookup www.baidu.com ,如果显示无法连接无法解析就是有问题,确定能上网就换个dns!3、能上网并dns配置没…

使用带逗号分割的字符串填充el-input-tag

用户在文本框中输入1,2,3,4,5 ,然后直接转变成tag,如果输入错误,可以直接点击叉号关闭当前,前端代码实现如下: <template><el-input-tagref="inputRef"tag-type="primary"v-model="obj.model"clearable@paste.native="handleI…

时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现

在异常检测领域,尤其针对工业机械、核反应堆和网络安全等复杂系统,传统方法往往难以有效处理高维度且相互关联的数据流。多元状态估计技术(MSET) 与序贯概率比检验(SPRT) 的组合方法在此类场景中展现出显著优势。 MSET-SPRT是一种结合机器学习状态估计与统计假设检验的混合技…

windows 查看控制台编码

在 powershell 上 [System.Text.Encoding]::Default在 cmd 上 chcp

vue+nuxt项目安装sass时报错:error Cant add nuxt-app: invalid package version

搭建vue+nuxt项目时候,需要用到sass,执行yarn add sass --dev时,报错:error Cant add "nuxt-app": invalid package version。如图: 解决方法: 1.执行命令:yarn set version stable 2.执行命令,再次安装sass: yarn add sass --dev方法二: 1.执行命令:npm…

直击痛点!精准配药零误差!PROFINET转MODBUS网关助力药房升级

在医疗安全备受关注的今天,医院药房配液中心的每一滴药液、每一张标签都关乎患者的生命健康。传统配液流程中,设备间协议不兼容导致的数据传输延迟、标签信息错位等问题,成为药房效率与安全的“隐形风险”。如何打破设备孤岛,实现精准、高效的智能化配液管理?稳联技术 PRO…

MCR08-ASEMI智能家居专用MCR08

MCR08-ASEMI智能家居专用MCR08编辑:LL MCR08-ASEMI智能家居专用MCR08 型号:MCR08 品牌:ASEMI 封装:TO-92 阻断电压:600V 通态电流:0.8A 类型:单向可控硅 工作温度:-40℃~150℃ 超低触发电流,节能更高效‌MCR08采用先进的半导体工艺,触发电流低至10μA以下,较传统可控…

在 Windows 环境下使用 VSCode 和 TinyGo 语言开发 ESP8266(NodeMcu)

1. 安装Go 2. 安装TinyGo,并添加环境变量 3. VSCode配置,安装插件,选择设备 package mainimport ("machine""time" )func main() {led := machine.LEDled.Configure(machine.PinConfig{Mode: machine.PinOutput})for {println("Hello, World"…

windows-web2

windows-web2 挑战内容 前景需要:小李在某单位驻场值守,深夜12点,甲方已经回家了,小李刚偷偷摸鱼后,发现安全设备有告警,于是立刻停掉了机器开始排查。 这是他的服务器系统,请你找出以下内容,并作为通关条件: 1.攻击者的IP地址(两个)? 2.攻击者的webshell文件名? …