[转载]泛化、实现、依赖和关联的区别

简介: 原文链接:http://www.cnblogs.com/linjiqin/archive/2013/11/09/3415440.html 传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系:a、实现表示类对接口的实现。

原文链接:http://www.cnblogs.com/linjiqin/archive/2013/11/09/3415440.html

传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系:
a、实现
表示类对接口的实现。
UML图中实现使用一条带有空心三角箭头的虚线指向接口,如下:

b、泛化
表示类与类之间的继承关系、接口与接口之间的继承关系。
UML图中实现使用一条带有空心三角箭头的实线指向基类,如下:

c、依赖
表现为函数中的参数(use a),是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。例如如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。如电视(TV)依赖于频道(channel)常见的依赖关系如下:
(1)类B以参数的形式传入类A的方法。
(2)类B以局部变量的形式存在于类A的方法中。
(3)类A调用类B的静态方法。
UML图中实现使用一条带有箭头的虚线指向被依赖的类,如下:

d、关联
表现为变量(has a),类与类之间的联接,它使一个类知道另一个类的属性和方法。例如如果A依赖于B,则B体现为A的全局变量,如person类和company类。

关联关系有双向关联和单向关联:
1、双向关联:两个类都知道另一个类的公共属性和操作。
2、单向关联:只有一个类知道另外一个类的公共属性和操作。
大多数关联应该是单向的,单向关系更容易建立和维护,有助于寻找可服用的类。
UML图中实现使用一条实线连接相同或不同类,如下:

e、聚合
是关联关系的一种,是弱的关联关系。聚合关系是整体和个体的关系。普通关联关系的两个类处于同一层次上,而聚合关系的两个类处于不同的层次,一个是整体,一个是部分。同时,是一种弱的“拥有”关系。此时整体与部分之间是可分离的,他们可以具有各自的生命周期, 部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
UML图中实现使用一条带有虚心菱形的线来表示,如下:

f、组合
是关联关系的一种,是比聚合关系强的关联关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。Composition(组合关系)是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一致。他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑,window窗口和frame,在窗口中创建一个frame时必须把它附加到窗口上,当窗口消失时frame也就消失了;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
UML图中实现使用一条带有实心菱形的线来表示

几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖

聚合和组合的区别:
聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用

聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司

关联和聚合的区别:
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。

作者: Candyメ奶糖

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
博文来源广泛,如原作者认为我侵犯知识产权,请尽快给我发邮件 359031282@qq.com联系,我将以第一时间删除相关内容。

目录
相关文章
|
3天前
|
人工智能 安全 搜索推荐
杭州AI开源生态大会·魔搭社区开发者嘉年华全回顾
11月22日,杭州AI开源生态大会暨“魔搭社区”开发者中心启用仪式在云谷中心举行。大会汇聚超3000名开发者,发布“两张清单”与AI开源政策包,启用首个线下开发者空间,推动开放、共建、共创的AI生态发展。
115 10
|
3月前
|
云安全 人工智能 自然语言处理
|
26天前
|
域名解析 缓存 网络协议
域名没输错却进了假网站?DNS欺骗防范指南
DNS欺骗如同网络“假路标”,篡改域名解析将用户引向伪造网站,窃取信息或传播 malware。其隐蔽性强,危害大,可致数据泄露、设备被控。防范方法包括:使用公共DNS(如114.114.114.114)、开启HTTPS、采用DoH/DoT加密解析。简单设置,即可大幅提升上网安全。
237 0
域名没输错却进了假网站?DNS欺骗防范指南
|
8月前
|
人工智能 固态存储 iOS开发
5分钟搞定Photoshop 2025安装:官方下载+许可证激活避坑指南
Adobe Photoshop 2025 是 Adobe 公司推出的最新图像处理软件,广泛应用于平面设计、摄影后期和 UI 设计等领域。其核心功能包括智能 AI 工具(一键抠图、生成填充等)、高效工作流(优化图层管理与色彩调整)、跨平台兼容(支持 Windows 11 和 macOS 15)以及云协作功能(与 Adobe Creative Cloud 集成)。本文详细介绍软件的安装流程、系统要求、正版激活方法及常见问题解决方案,并提供扩展学习资源,帮助用户更好地掌握这款强大工具。
32551 3
|
4月前
|
算法 IDE 测试技术
python学习需要注意的事项
python学习需要注意的事项
268 57
|
9月前
|
监控 Java Go
阿里云可观测全面拥抱 OpenTelemetry 社区
阿里云作为全球领先的云服务商,始终站在开源观测技术最前沿。深度参与 OTel 社区,坚定支持技术开放生态与全球兼容性技术标准的构建。
346 98
|
6月前
|
人工智能 自然语言处理 算法
破界重构:生成式AI认证(GAI)-让青年学生成为智能时代的驾驭者
在人工智能重塑社会生产力的今天,青年如何从技术变革的被动接受者转变为智能时代的主动驾驭者?掌握生成式人工智能认证(GAI认证)成为关键。它不仅打破“技术崇拜”,还通过技术原理、实战应用与伦理合规模块,重新定义专业能力。GAI认证推动教育范式革命,以开放性与产业联动助力公平创新。面对技术与人性的张力,认证赋予青年工具理性与价值理性,使其成为智能文明的“掌舵者”。这不仅是技术的突破,更是回归人性的探索,开启未来的大门。
|
8月前
|
监控 安全 物联网
危化品行业人员定位系统解决方案:预防安全事故、提升应急响应能力
本文旨在深入探讨危化品行业人员定位系统的最新技术革新,解决如何在高风险环境中高效、精准地监测与管理人员位置,从而预防安全事故、提升应急响应能力的问题。如需获取人员定位系统方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
208 4
|
8月前
|
人工智能 自然语言处理 数据安全/隐私保护
阿里云中国金融大模型整体市场第一
阿里云以33%的市场份额夺得中国金融大模型整体市场第一
|
11月前
|
Cloud Native 安全 Java
铭师堂的云原生升级实践
铭师堂完整经历了云计算应用的四个关键阶段:从”启动上云”到”全量上云”,再到”全栈用云”,最终达到”精益用云”。通过 MSE 云原生网关的落地,为我们的组织带来了诸多收益,SLA 提升至100%,财务成本降低67%,算力成本降低75%,每次请求 RT 减少5ms。
铭师堂的云原生升级实践