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

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

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

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

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

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

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

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

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

2、依赖关系

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

相关推荐
BD_Marathon12 小时前
设计模式——合成复用原则
设计模式·合成复用原则
书院门前细致的苹果1 天前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
BD_Marathon1 天前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon1 天前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
jmxwzy1 天前
设计模式总结
设计模式
J_liaty2 天前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇2 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日2 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.2 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon2 天前
七大设计原则介绍
设计模式