类图(class diagram)

类图(class diagram)是一种静态模型。它可以帮助开发者👨‍💻利用面向对象思维进行软件建模。

类图中的每个类都由一个框表示。每个盒子🗃️分为三个部分

🥇顶部是类名,对应 Java 中的类名,如果是抽象类则用斜体表示。

🥈中间部分是属性部分,对应 Java 中的成员变量,用于抽象出事物的属性。主要由作用域、变量名和变量类型组成。

🥉底部是操作部分,对应 Java 中的成员方法,用于抽象出事物的行为。主要由作用域、操作名称、参数列表和返回类型组成。如果是抽象方法则用斜体表示;如果是静态方法则用下划线表示。

抽象类 接口

✨作用域表示如下:

符号 作用域 描述
- private 当前类
~ default 或者 package 当前类、同一包下
# protected 当前类、同一包下、子类
+ public 当前类、同一包下、子类、其他包下

类图中的关系

面向对象设计中的分解与 UML 中的关系对应。其中类间的关系分为 6 种。分别是依赖关联泛化(继承)、实现(接口)、聚合组合

关系 图像 备注
依赖 箭头指向被依赖的部分
关联 单向关联的箭头指向被关联的部分
泛化 空心三角形指向父类
实现 空心三角形指向接口
聚合 菱形指向整体
组合 菱形指向整体

1️⃣依赖(dependency):依赖是一种 use-a 的关系。依赖表示一个类为其他类提供它的服务。

例如,一架客机需要依赖跑道起飞。

2️⃣关联(association):一种简单的关联关系,并不存在依赖关系。在类中,关联是一种拥有关系。关联关系意味着两个对象之间存在松散的关系。这些对象可能会在一段时间内相互交互。

例如,一个类的对象可以使用另一个类的对象提供的服务/方法。 这就像人与航空公司之间的关系。一个人通常不拥有航空公司,但可以与一家航空公司互动。航空公司还可以与许多人对象进行交互。

3️⃣泛化(inheritance):泛化表示子类拥有父类的所有属性和方法。在绘制类图时,不需要在子类写出父类已有的属性或方法。

例如,猫对象和狗对象都拥有动物对象的年龄属性和吃饭行为。

4️⃣实现(implementation):实现和泛化一样,但是实现接口使用虚线加空心三角形表示。

5️⃣聚合(aggregation):聚合是一种弱 has-a 的关系,部分可以属于整体,但它们也可以独立存在。聚合关系是一种弱关系,一种生命周期不同步的关系。

例如,这就像客机与其机组人员之间的关系。客机的一个重要部分是它的机组人员。没有机组人员,客机将无法飞行。但是,如果机上没有机组人员,客机也不会不存在。机组人员也是如此,他们是客机运营的一部分,但如果机组人员不在客机上,他们也不会消失或被摧毁。

6️⃣组合(composition):组成是对部分的排他性包含,也称为强 has-a 关系。这意味着整体不能没有它的部分而存在。如果失去了它的任何部分,整体就不复存在了。如果整体被摧毁,那么它的所有部分也被摧毁。通常只能通过其整体访问部分。包含的部分是整体独有的。组合关系是一种强关系,一种生命周期同步的关系。

例如,大脑是人类组成的一部分,人没有大脑会死,大脑没有人也不能存在。

✨多重性:

基数 描述
0 .. 1 表示 0 到 1 个
n 表示任意个
0 .. * 表示 0 到任意多个
1 .. * 表示 1 到任意多个
m .. n 表示任意多个到任意多个

示例类图 1:

示例类图 2:


关系间的区别

🔖依赖和关联的区别:

👉依赖关系 是一种 短期的临时性的弱的 关系,一般来说是 单向的 ,常出现在方法参数和局部变量中。例如,一架客机需要依赖跑道起飞。每架客机并不需要配有专门的跑道,它只有在需要起飞时才需要依赖到跑道。转换成代码思维就是:客机类不需要有跑道类类型的成员变量,只需要在起飞行为时,传入指定的跑道类类型参数即可。

👉关联关系 是一种 长期的表示拥有的强的 关系,可以是 单向或者双向的 ,常出现在成员变量和全局变量中,它意味着两个对象可能在一段时间内会进行交互。例如,人与航空公司之间的关系,人可以与多个航空公司互动,航空公司也可以跟多个人互动。转换成代码思维就是:用户类中可以用成员变量保存自己注册过的航空公司类对象,航空公司类也可以用成员变量保存注册过会员的用户信息。

🔖关联、聚合和组合的区别:

👉关联关系 是一种 平等的较弱的 关系,是 个体与个体 的。例如,人与航空公司之间的关系是平等的。

👉聚合关系 是一种 不平等的较强的 关系,是 整体与部分 的,并且 生命周期不同步 ,部分可以离开整体存在。例如,显示器是台式电脑的一部分,但是显示器除了作为电脑屏幕还可以作为监控屏幕,离开了电脑依旧能存在,生命周期是不同步的。

👉组合关系 是一种 不平等的最强的 关系,是 整体与部分 的,并且 生命周期同步 ,部分无法离开整体存在。例如,眼睛是人的一部分,但是人死了眼睛也就自然死了,生命周期是同步的。



📌最后:希望本文能够给您提供帮助,文章中有不懂或不正确的地方,请在下方评论区💬留言!

🔗参考文献:

▶️ bilibili - UML类图