UML类图浅探

其实UML类图在软件工程专业的学习中很常见,最近被面向对象设计的作业逼得没办法,设计模式很多的课件都是直接上UML类图,所以来自己浅学一波,顺便水一波博客(bushi),下面我们就开始(^▽^)~

假如说,现在我们有一个学生类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Student {
private String schoolNum;

public String name;

private int height;

private int weight;

package bool gander;

protected String address;

public void eat(Food food) {};

private void sleep(int time) {};

protected void study(int time) {};
}

那么这个类用UML类图就可以表示为:

image-20220418194039635

类的标题

表示方法 意义
类名 普通类
<<类名>> 接口类

前面的符号

对于成员变量和方法的可访问性表示:

符号 代码 可访问性
+ public 公开的
- private 私有的
# protected 仅子类和自己可访问的
~ package 包内可访问的

成员变量的表示

<可访问性符号> <变量名> : <变量类型>

eg:

+ names : String[]

- height : int

~ bander : bool

# address : String

方法的表示

<可访问性符号> <方法名(<变量名> :<变量类型>, …)> :<返回类型>

eg:

+ eat(food : Food, water : Drink) : void

- sleep(time : int) : void

类间关系

依赖关系

依赖关系UML表示

image-20220418200728828

使用虚线线条型箭头

依赖关系的表现形式

  • B类的实例作为A类方法的参数
  • B类的实例作为A类方法的局部变量
  • A类调用B类的静态方法

以上例子即为Food的实例作为Student中eat方法的参数

关联关系

在Java中实现关联关系时,通常将一个类的对象作为另一个类的成员变量。

在UML类图中,用实线连接有关联关系的类,并可在关联线上标注角色名或关系名。

单向关联

image-20220418202551031

使用单向箭头,并在箭头上写明关系

双向关联

image-20220418203035232

使用双向箭头

image-20220418203025100

或者使用无头线段直接连接

关联关系

类似E-R图中

表示方式 多重性说明
1..1 另一个类的一个对象只与该类的一个对象有关系
0..* 另一个类的一个对象只与该类的零个或多个对象有关系
1..* 另一个类的一个对象与该类的一个或多个对象有关系
0..1 另一个类的一个对象与该类的对象没关系或者只与该类的一个对象有关系
m..n 另一个类的一个对象与该类最少m,最多n个对象有关系

表格来源:UML(一) 类图详解 - 云+社区 - 腾讯云 (tencent.com)

聚合关系

是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

image-20220418203951763

聚合关系使用起点:小菱形,终点:线条型箭头表示

该例子中,单独的成绩离开对应的学生后就毫无意义(阿巴阿巴(/ω\)似乎也不一定对,你理解意思就行)

组合关系

组合(Composition)关系也表示类之间整体和部分的关系,但是在组合关系中整体对象控制成员对象的生命周期,一旦整体对象不存在了,成员对象也即随之消亡。

从代码实现上看,一般在整体类的构造方法中直接实例化成员类,并且除整体类对象外,其它类的对象无法获取该对象的引用。

image-20220418204349777

组合关系使用起点:黑色菱形,终点:线条型箭头表示

该例子中,Leg的两个实例在Student的legs成员变量中,随着Student的销毁而被销毁

泛化关系 / 继承关系

是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

在Java中,我们使用面向对象的三大特性之一——继承来实现泛化关系,具体来说会用到extends关键字。

在UML类图中,泛化关系用带空心三角形(指向父类)的实线表示。并且子类中不需要标明其从父类继承下来的属性和方法,只须注明其新增的属性和方法即可。

image-20220418204848425

实现关系

在UML类图中,类与接口间的实现关系用带空心三角形的虚线表示。同时类中也需要列出接口中所声明的所有方法(这一点与类间的继承关系表示不同)。

java中表现为implements

image-20220418205022485

想不出来了直接用网图了

关系强弱排序

泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

参考资料:

UML:类图关系总结 - 知乎 (zhihu.com)

设计模式之 UML 类图 - 知乎 (zhihu.com)

UML(一) 类图详解 - 云+社区 - 腾讯云 (tencent.com)