【设计模式】01:类间关系

文章详细介绍了类间的五种关系:继承(泛化)、关联(包括单向、双向和自关联)、聚合、组合以及依赖。继承描述了类的层次结构,关联表示对象间的联系,聚合和组合体现整体与部分的关系,依赖则表示一个对象使用另一个对象。在UML中,这些关系有不同的图形表示。关联、聚合和组合的关系强度依次减弱,且聚合和组合在语义和生命周期上有显著区别。实际应用中,这些关系帮助设计师构建合理、灵活的系统架构。
摘要由CSDN通过智能技术生成

类间关系


1.继承关系

继承也叫作泛化(Generalization),用于描述父子类之间的关系,父类又称为基类或者超类,子类又称作派生类。在 UML 中,泛化关系用带空心三角形的实线来表示。关于继承关系一共有两种:普通继承关系和抽象继承关系,但是不论哪一种表示继承关系的线的样式是不变的。

在这里插入图片描述

2.关联关系

关联(Assocition)关系是一种结构化的关系,表示一个对象与另一个对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等。在 UML 类图中,用(带接头或不带箭头的)实线连接有关联关系的类。在 C++ 中这种关联关系在类中通常是将一个类的对象作为另一个类的成员变量。类之间的关联关系有三种,分别是:单向关联、双向关联、自关联。

单向关联

如果是单向关联,使用的连接线是带单向箭头的实线 , 哪个类作为了当前类的成员变量,那么箭头就指向哪个类。

在这里插入图片描述

双向关联

一般使用没有箭头的实线来连接有双向关联关系的两个类,这两个类的对象分别作为了对方类的成员变量。

在这里插入图片描述

自关联

自关联指的就是当前类中包含一个自身类型的对象成员,

这在链表中非常常见,单向链表中都会有一个指向自身节点类型的后继指针成员,而双向链表中会包含一个指向自身节点类型的前驱指针和一个指向自身节点类型的后继指针。

在这里插入图片描述

3.聚合关系

聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示,下面举两个聚合关系的例子:

  • 汽车与引擎、轮胎、车灯
  • 森林与植物、动物、水、阳光

代码实现聚合关系,成员对象通常以构造方法、Setter 方法的方式注入到整体对象之中,因为成员对象可以脱离整体对象独立存在。

表示聚合关系的线,有空心菱形的一端指向整体对象,另一端连接局部对象

在这里插入图片描述

4.组合关系

组合(Composition)关系表示整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在。

  • 头和嘴巴、鼻子、耳朵、眼睛
  • 树和树根、树干、树枝、树叶

代码实现组合关系,通常在整体类的构造方法中直接实例化成员类,因为组合关系的整体和部分是共生关系,整体的实例对象被析构的时候它的子对象也会一并被析构。如果通过外部注入,即使整体不存在了部分还是存在的,这样的话就变成聚合关系了。

组合关系用带实心菱形的直线表示:

在这里插入图片描述

5.依赖关系

依赖(Dependency)关系是一种使用关系特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数

  • 驾驶员开车,需要将车Car对象作为参数传递给 Driver 类的drive方法。
  • 树木的生长,需要将空气Air、水Water、土壤Soil对象作为参数传递给Tree类的grow方法。

依赖关系通常通过三种方式来实现:

  1. 将一个类的对象作为另一个类中方法的参数
  2. 在一个类的方法中将另一个类的对象作为其对象的局部变量
  3. 在一个类的方法中调用另一个类的静态方法

依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方

在这里插入图片描述

最后总结

类之间的关系强弱顺序:继承(泛化) > 组合 > 聚合 > 关联 > 依赖(使用最强的关系描述即可)

关联关系、聚合关系和组合关系三者之间比较相似,最后就来总结一下这三者之间的区别:

  1. 关联和聚合的区别主要在于语义上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。
  2. 聚合和组合的区别则在语义和实现上都有差别:
    • 组合的两个对象之间生命周期有很大关联,被组合的对象在组合对象创建的同时或者创建之后创建在组合对象销毁之前销毁,聚合则无需考虑这些事情。
    • 一般被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,聚合则不一样,被聚合的对象可以属于多个聚合对象。

实际中这三种关系的界限划分不必划分的如此清楚,只要能够利用对象之间的关系设计出可行的解决方案即可。

  • 参考课程:https://subingwen.cn/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值