文章目录

1.依赖(Dependency)

2.关联(Association)

3.聚合(Aggregation)

4.组合(复合,Composition)

5.泛化(Generalization)

6.小结

参考文献


在学习面向对象设计时,类关系涉及依赖、关联、聚合、组合和泛化这五种关系,耦合度依次递增。关于耦合度,可以简单地理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强。

下面根据个人理解,尝试讲解这五种类关系。

1.依赖(Dependency)

依赖关系使用虚线加箭头表示,如下图所示:

学生在学习生活中经常使用电脑,于是对电脑产生了依赖。依赖关系是五种关系中耦合最小的一种关系。类A要完成某个功能引用了类B,则类A依赖类B。依赖在代码中主要体现为类A的某个成员函数的返回值、形参、局部变量或静态方法的调用,则表示类A引用了类B。以Student类和Computer类为例,用C++语言编码如下:

class Computer {public:static void start(){cout<<"电脑正在启动"<<endl;}};class Student {public://返回值构成依赖Computer& program();//形参构成依赖void program(Computer&);void playGame() {//局部变量构成依赖Computer* computer=new Computer;...//静态方法调用构成依赖Computer::star();}};

2.关联(Association)

关联关系使用实线加箭头表示,类之间的关系比依赖要强。学生与老师是关联的,学生可以不用电脑,但是学生不能没有老师。如下图所示:

关联与依赖的对比:

相似之处:

关联暗示了依赖,二者都用来表示无法用聚合和组合表示的关系。

区别:

(1)发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。

发生关联关系的两个类,类A成为类B的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。 在代码中的表现如下:

class Teacher;class Student {public:Teacher teacher; //成员变量void study();}    

(2)从关系的生命周期来看,依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束。关联关系当类实例化的时候产生,当类对象销毁的时候关系结束。相比依赖,关联关系的生存期更长。

关联关系有单向关联、双向关联、自身关联、多维关联等等。其中后三个可以不加箭头。

单向关联:

双向关联:

自身关联:

多维关联:

3.聚合(Aggregation)

聚合关系使用实线加空心菱形表示。聚合用来表示集体与个体之间的关联关系。例如班级与学生之间存在聚合关系,类图表示如下:

聚合关系在代码上与关联关系表现一致,类Student将成为类Classes的成员变量。代码如下:

class Student;class Classes {public:Student* student;Classes(Student* stu):student(stu) {}};

4.组合(复合,Composition)

复合关系使用实线加实心菱形表示。组合又叫复合,用来表示个体与组成部分之间的关联关系。例如学生与心脏之间存在复合关系,类图表示如下:

组合关系在代码上与关联关系表现一致,类Heart将成为类Student的成员变量。代码如下:

class Heart;class Student {public:Heart* heart;Student() {heart=new Heart;}~Student() {delete heart;}};

聚合与组合的对比:

(1)聚合关系没有组合紧密。

学生不会因为班级的解散而无法存在,聚合关系的类具有不同的生命周期;而学生如果没有心脏将无法存活,组合关系的类具有相同的生命周期。

这个从构造函数可以看出。聚合类的构造函数中包含另一个类的实例作为参数,因为构造函数中传递另一个类的实例,因此学生可以脱离班级体独立存在。组合类的构造函数包含另一个类的实例化。因为在构造函数中进行实例化,因此两者紧密耦合在一起,同生同灭,学生不能脱离心脏而存在。

(2)信息的封装性不同。

在聚合关系中,客户端可以同时了解Classes类和Student类,因为他们是独立的。

在组合关系中,客户端只认识Student类,根本不知道Heart类的存在,因为心脏类被严密地封装在学生类中。

理解聚合与复合的区别,主要在于聚合的成员可独立,复合的成员必须依赖于整体才有意义。

5.泛化(Generalization)

泛化是学术名称,通俗来讲,泛化指的是类与类之间的继承关系和类与接口之间的实现关系

继承关系使用直线加空心三角形表示。类图结构如下:

类接口的实现关系使用虚线加空心三角形表示。类图结构如下:

6.小结

依赖、关联、聚合、组合与泛化代表类与类之间的耦合度依次递增。依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,组合是一种更强的关联,泛化则是一种最强的关联,所以笼统的来区分的话,实际上这五种关系都是关联关系。

依赖关系比较好区分,它是耦合度最弱的一种,在编码中表现为类成员函数的局部变量、形参、返回值或对静态方法的调用。关联、聚合与组合在编码形式上都以类成员变量的形式来表示,所以只给出一段代码我们很难判断出是关联、聚合还是组合关系,我们需要从上下文语境中来判别。关联表示类之间存在联系,不存在集体与个体、个体与组成部分之间的关系。聚合表示类之间存在集体与个体的关系。组合表示个体与组成部分之间的关系。

依赖、关联、聚合与组合是逻辑上的关联,泛化是物理上的关联。物理上的关联指的是类体的耦合,所以类间耦合性最强。


参考文献

[1] 认识UML中类之间的依赖、关联、聚合、组合、泛化的关系

[2] UML类关系(依赖,关联,聚合,组合的区别)

[3] 谈一谈自己对依赖、关联、聚合和组合之间区别的理解

认识 UML 类关系——依赖、关联、聚合、组合、泛化相关推荐

  1. 转载:认识UML类关系——依赖、关联、聚合、组合、泛化

    文章目录 1.依赖(Dependency) 2.关联(Association) 3.聚合(Aggregation) 4.组合(复合,Composition) 5.泛化(Generalization) ...

  2. UML关系(泛化,实现,依赖,关联(聚合,组合))

    UML的构造快包含3种: (1) 事物(4种):结构事物,行为事物,分组事物,注释事物 (2) 关系(4种):泛化关系,实现关系,依赖关系,关联关系 (3) 图(10种):用例图,类图,对象图,包图, ...

  3. 【UML关系(泛化、实现、依赖、关联(聚合,组合))】

    UML关系(泛化,实现,依赖,关联(聚合,组合))

  4. 转:UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    转:UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 原文:https://www.cnblogs.com/firstcsharp/p/5327659.html 类与类图 1) 类(Clas ...

  5. java 正则表达式 组合_java基础:5.1 面向对象、类的关联 聚合 组合、正则表达式...

    上一个礼拜太忙了,今天开始恢复java的学习~ 目录 1.面向过程--面向对象的区别 传统的面向过程式编程是动作驱动的,数据和动作是分离的.面向对象编程的范式重点在于对象,动作和数据一起定义在对象中. ...

  6. UML类关系(依赖,关联,聚合,组合,泛化,实现)

    转自https://blog.csdn.net/k346k346/article/details/59582926 在学习面向对象设计时,类关系涉及依赖.关联.聚合.组合和泛化这五种关系,耦合度依次递 ...

  7. UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什 ...

  8. ULM图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    在UML中,类使用包含类名.属性和操作且带有分隔线的长方形来表示,如定义一个Employee类,它包含属性name.age和email,以及操作modifyInfo() public class Em ...

  9. Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)

    文章目录 1.查询函数 2.F对象 3.Q对象 4.聚合函数 5.Count函数 6.查询集 查询集的特性 对查询集进行切片 判断一个查询集中是否有数据 7.模型类之间的关系 一对多关系 多对多关系 ...

最新文章

  1. JQ实现导航效果(附效果图)
  2. python导入外部包_您会喜欢的10个外部Python软件包
  3. python time datetime string 相互转换
  4. 年底了,游戏大作连连
  5. MySQL中EXPLAIN命令详解
  6. 将本地docker镜像推送到阿里云镜像仓库
  7. pythonapi是什么意思_python api是什么
  8. 树莓派编译一个C程序
  9. break VS continue
  10. pthread-win32在VC2005下的使用
  11. 收藏:如何获取当前已经打开的IE对象(VB6代码)
  12. 大橙子_【大橙子喜讯】工程学子斩获佳绩!——机械创新设计大赛
  13. c++和QT实现俄罗斯方块,使用GraphicsView。
  14. vs程序 C++语言的给textbox加限制
  15. linux界面程序崩溃,Linux 下安装anjuta程序运行崩溃 只能用glade做界面
  16. javaScript前端上传文件到腾讯云(对象存储)
  17. 红黑联盟现场实地渗透测试培训第一期
  18. discuz模板介绍
  19. 使用pygame实现双人五子棋游戏
  20. python打印电子标签--ghostscript 和reportlab实现

热门文章

  1. 大数据笔记(十三)——常见的NoSQL数据库之HBase数据库(A)
  2. 从链接中获取文件名及扩展名
  3. hdu 1297 递推难题
  4. 各种封装——封装getClass
  5. 向量叉乘判断两向量之间是顺时针还是逆时针
  6. tomcat日志,用户以及启动时的一些问题
  7. regini.exe使用方法
  8. Linux CentOS6离线安装Jupyter notebook
  9. linux安装各种文件格式,Embeded linux中的各类文件系统
  10. java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型