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

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

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

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

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

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

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

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

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

2、依赖关系

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

相关推荐
Tiny_React7 小时前
智能体设计模式-附录 C - 智能体框架快速概览
设计模式
YBN娜10 小时前
设计模式-创建型设计模式
java·开发语言·设计模式
YuanlongWang11 小时前
C# 设计模式——单例模式
单例模式·设计模式·c#
Code_Geo11 小时前
agent设计模式:第二章节—路由
网络·设计模式·路由
太过平凡的小蚂蚁12 小时前
解耦的艺术:深入理解设计模式之命令模式
设计模式·命令模式
Meteors.14 小时前
23种设计模式——外观模式(Facade Pattern)详解
设计模式·外观模式
胖虎114 小时前
iOS中的设计模式(九)- 外观模式 用外观模式点一份外卖:Swift 实战讲解
设计模式·外观模式
Asort16 小时前
JavaScript设计模式(十六)——迭代器模式:优雅遍历数据的艺术
前端·javascript·设计模式
昨天的猫16 小时前
原来我们写的单例还存在缺陷~~
设计模式
Tiny_React16 小时前
智能体设计模式-CH13:人类参与环节(Human-in-the-Loop)
设计模式