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

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

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

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

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

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

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

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

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

2、依赖关系

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

相关推荐
kylezhao20191 小时前
C#23种设计模式-单例模式(Singleton)详解与应用
单例模式·设计模式·c#
会员果汁1 小时前
5.设计模式-工厂方法模式
设计模式·工厂方法模式
@zulnger2 小时前
python 设计模式
设计模式
Poetinthedusk17 小时前
设计模式-命令模式
windows·设计模式·c#·wpf·命令模式
雨中飘荡的记忆18 小时前
设计模式之桥接模式:从原理到实战
设计模式
北海屿鹿18 小时前
设计模式概述
设计模式
真夜20 小时前
发布观察者模式使用场景记录
设计模式
会员果汁1 天前
4.设计模式-代理模式
设计模式·代理模式
有一个好名字1 天前
设计模式-代理模式
java·设计模式·代理模式
catchadmin1 天前
PHP 之高级面向对象编程 深入理解设计模式、原则与性能优化
设计模式·性能优化·php