类的关联、依赖、聚合和组合关系的思考(一)

devtools/2024/10/19 2:18:38/

最近在看《设计模式》这本书,发现对类之间的关系还没搞的很明白,而类之间的关系对读书、阅读代码和代码设计都非常重要,因此边看书边查阅了一些资料,感觉有些理解了。下面是我的一些思考,分享一下。

查阅了很多博客,类的关系一般就分为关联、依赖、组合、聚合和继承。继承关系很清楚,这里不谈。

在《设计模式》中,类图使用的OMT表示法,而主流使用UML表示法,两者关于类的关系的表示大部分是相同的,只有一些小的区别,然而,正是这些“区别”让人醍醐灌顶。

1、关联关系:看了很多资料,都将关联关系与聚合、组合关系并列,但实际上,聚合、组合关系都应是关联关系的一种。而如果真的要区分的话,可以这样理解:关联关系范指聚合、组合关系之外的关联关系。

        聚合与组合是一样的,都是指类A中聚集了类B。聚合与组合的区别在于:类A与类B两者的生命周期是否相同。如果类B与类A的生命周期相同,则是组合,反之就是聚合。

        举个栗子:汽车和轮子的关系,汽车聚集了四个轮子,两者的关系是聚合还是组合呢,我认为这和我们的需求和设计有关。假设我们的需求是,汽车对象消亡了,轮子对象依然存在且可以用在其他汽车对象或飞机对象上,此时两者的关系就是聚合。如果我们需求是,汽车对象消亡了,轮子对象也必须一同消亡,汽车不存在轮子也就不存在了,也就谈不上将轮子用到其他汽车上,此时两者的关系就是组合。

         因此,组合是一种比聚合要更紧密的关系(关联关系)。两个对象不可能既是组合又是聚合。

        对于关联关系怎么说呢,很多资料里都写的是类A中有一个成员是类B,虽然是一对一,但本质上也是一种聚合或组合的关系。所以,在一般情况下,设计代码的、绘制类图的时候,就要明确是聚合还是组合,在UML中关联关系一般是指类A中有一个成员是类B,这是一种单向的关联关系,如果同时类B中有个成员是类A, 此时就是双向的关联关系。

2、依赖关系

      依赖关系一般是指类A中的成员函数的形参是类B的引用,或类A成员函数返回类B的引用。


http://www.ppmy.cn/devtools/121150.html

相关文章

leetcode45:跳跃游戏||

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最小…

如何修复变砖的手机并恢复丢失的数据

您可能之前听说过“变砖”&#xff0c;但您知道什么是变砖手机吗&#xff1f;正如许多论坛中经常提出的问题一样&#xff0c;我如何知道我的手机是否变砖了&#xff1f;好吧&#xff0c;手机变砖主要有两种类型&#xff0c;即软件变砖和硬变砖。软变砖手机意味着重启后您仍然可…

git 本地代码关联远程仓库并推送

初始化代码仓库 如果你的本地项目还没有使用Git管理&#xff0c;首先需要在项目根目录下初始化一个Git仓库 git init添加远程仓库地址 使用 git remote add 命令添加远程仓库 git remote add origin https://github.com/username/repository.git获取远程分支信息 使用 git…

【2024】前端学习笔记12-JavaScript初体验-Js操作window

学习笔记 1.什么是JavaScript2.JavaScript初体验3.案例:弹出一个带确认、取消的对话框4.JS之window对象4.1.window.open:打开新窗口4.2.window.innerWidth/innerHeight:获取浏览器窗口宽度和高度4.3.window.location.reload:重新加载当前页面4.4.window.document:操作文档…

C--编译和链接见解

欢迎各位看官&#xff01;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论 感谢各位看官的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;翻译环境和运行环境 在ANSIIC的任何一种实现中&#xff0c;存在两个不同的环境1&#xff0c;…

C++七种异常处理

在C++中,使用异常机制可以提高程序的健壮性和可维护性。异常是在程序运行时发生的一个事件,它会打断正在执行的程序的正常流程。C++异常处理机制可以使程序在出现异常时,进行异常处理,而不是退出程序。 基本的异常处理 #include <iostream> using namespace std;int …

Oracle架构之物理存储之日志文件

文章目录 1 日志文件1.1 重做日志文件&#xff08;Redo Log Files&#xff09;1.1.1 定义1.1.2 联机日志的相关概念1.1.3 动态性能视图1.1.4 手工切换日志1.1.5 添加日志文件组和日志组成员1.1.6 删除日志组和日志组成员1.1.6.1 前言1.1.6.2 删除日志组1.1.6.3 删除日志组成员 …

Gas费用是什么?

Gas费用是什么? 每5个Byte 需要1个GasGasLimit 用来限制合约最多执行多少次运算GasPrice 每次计算需要支付的费用在Web3的语境中,尤其是在以太坊(Ethereum)这样的区块链平台上,Gas费是一个核心概念。以下是关于Gas费的详细解释: 1. 定义 Gas是以太坊网络上的计算单位,…