UML,全称Unified Modeling Language,统一建模语言。UML图分为用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。在面向对象语言中,我们经常看到有用UML类图去表示各种接口和类之间关系的。本文主要记录UML类图中常用的六中类关系。
Created 2020.09.20 by William Yu; Last modified: 2022.08.19-V1.2.4
Contact: windmillyucong@163.com
Copyleft! 2022 William Yu. Some rights reserved.
UML类图
References
- post https://segmentfault.com/a/1190000021317534
- post https://zhuanlan.zhihu.com/p/109655171
- book 《大话设计模式》程杰
- pose https://www.lucidchart.com/pages/uml-class-diagram#:~:text=In%20UML%2C%20a%20class%20represents,its%20attributes%2C%20and%20its%20operations.
1. 类图
1. 具体类的表示
-
UML 使用矩形框表示具体类
- 矩形框分为三层
- 第一层是类的名字
- 第二层是类的成员变量
- 第三层是类的方法
- 成员变量以及方法的访问修饰符:
- public, +
- private, -
- protected, # (friendly也归入这类)
- default,~ 或者不带符号
- static, _ 下面添加下划线表示 比如这样:static int a;
- Derived, /
-
属性的完整表示:
可见性 名称 :类型 [ = 缺省值]
中括号中的内容表示是可选的
-
方法的完整表示:
可见性 名称(参数列表) [ : 返回类型]
同样,中括号中的内容是可选的
2. 抽象类的表示
- 抽象类名以及抽象方法用斜体字表示
3. 接口的表示
- 接口在类图的顶端用构造型
<<interface>>
表示 - 此外,接口也可以使用 棒棒糖表示法
- 类上面的一根棒棒糖(圆圈+实线)
- 圆圈旁边为接口名称
- 接口方法在实现类中出现
2. 类间关系表达
UML类图的六种关系:
- 依赖关系
- 关联关系
- 聚合关系
- 组合关系
- 实现关系
- 泛化关系
2.1 实现关系(realize)
- 实现关系就是接口和实现类之间的关系。 implements
- 类实现了接口中的抽象方法。
- 在最终的代码中,表现为继承抽象类
- 在UML类图中,用带空心三角箭头的虚线来表示实现关系,箭头从实现类指向接口。
- e.g. 大学是个接口,北京大学和清华大学分别实现了大学接口。
2.2 泛化关系(Generalization)
- 泛化关系其实就是父子类之间的继承关系,表示一般与特殊的关系,指定子类如何特殊化父类的特征和行为。
- “is a” 关系
- A 是父类,B是子类,可以认为 B is a A。
- 最终代码中,泛化关系表现为继承非抽象类
- 在UML类图中,用带空心三角箭头的实线来表示泛化关系,箭头从子类指向父类。
- 如上图,父类动物有一个吃的方法,小鸟和狮子都继承于动物类,小鸟有它特有的方法飞行,而狮子有特有的方法奔跑。
2.3 关联关系(Association)
- 关联关系又分为
- 依赖关联、聚合关联和组合关联三种类型。
- “引用”
- 表示一个类和另外一个类之间的联系,如老师和学生,丈夫和妻子等
- 关联关系的代码表现形式为一个对象含有另一个对象的引用
- 关联关系有单向和双向的
- 最终代码中,表现为成员变量
- 在UML类图中
- 单向关联用一个带箭头的实线表示,箭头从使用类指向被关联的类
- 双向关联用带箭头或者没有箭头的实线来表示
- e.g.
- 老师和学生之间的关系是双向的,一个老师可以有多个学生,一个学生也可以有多个老师
- 学生和课程之间是单向的,一个学生会学习多门课程,而课程是一个抽象的概念,它不拥有学生
补充:多重性表达式
- 一个对象可以持有其他对象的数组或者集合,在UML中,可以放置多重性(multiplicity)表达式在关联线的末端来表示。
- 多重性表达式可以是一个数字,一段范围或者他们的组合。
- 多重性表达式格式:
- 数字:精确的数量
- *或者 0.. * : 表示0到多个
- 0..1:表示0个或者1个
- 1..*:表示1到多个
2.4 依赖关系(Dependency)
-
是一种弱关联关系
-
“使用” “use a”
-
表示某个类依赖于另外一个类
-
通常表现为,某个类的方法的参数使用了另外一个类的对象
-
A 使用 B,A 为使用类,B为被依赖的类,对象A依赖于对象B
-
最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性
-
在UML类图中,依赖关系用带箭头的虚线表示
-
箭头从使用类A指向被依赖的类B
-
e.g. 下图中表示,程序员依赖于计算机来编写代码。
-
e.g.
![img](https://upload-images.jianshu.io/upload_images/5336514-823083d2d77916ae.png?imageMogr2/auto-orient/strip imageView2/2/w/414/format/webp)
2.5 聚合关系(Aggregation)
- 是关联关系的一种特例
- 它体现的是整体与部分的拥有关系
- 即 “has a” 的关系
- 聚合关系在类中是通过成员对象来体现的
- 成员是整体的一部分,成员也可以脱离整体而存在。如老师是学校的一部分,同时老师也是独立的个体,可以单独存在。
- 在UML类图中,用带空心菱形的实线来表示聚合关系,菱形指向整体。
-
e.g.
![img](https://upload-images.jianshu.io/upload_images/5336514-e63191f4e23f2ad9.png?imageMogr2/auto-orient/strip imageView2/2/w/297/format/webp)
2.6 组合关系(Composition)
- 也是关联关系的一种特例
- 组合关系是整体和部分之间的关系,但是一种比聚合关系还要强的关系
- 即 “contains a” 的关系
- 聚合关系的组成部分是可以脱离整体独立存在的,组合关系的部分无法独立存在
- 此时整体与部分是不可分的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期。
- 部分对象不能脱离整体对象而单独存在,如人的身体和大脑之间的关系,大脑不能脱离身体而单独存在。
- 在UML类图中,用带实心菱形的实线来表示组合关系,菱形指向整体。
聚合关系与组合关系的差别
从代码上看:
- 聚合关系的A类里含有另一个B类作为参数,需要在构造A类之前构造B类
- 组合关系的类里含有另一个类的实例化,会在构造A类的内部构造B类
1
2
3
4
5
6
7
8
9
10
11
12
public class GooseGroup {
public Goose goose;
public GooseGroup(Goose goose) {
this.goose = goose;
}
}
class Goose {
public Wings wings;
public Goose() {
wings=new Wings();
}
}
- 聚合关系中,客户端可以同时了解两个类
- 组合关系中,客户端只能了解A类,B类被严密封装在A类中
总结
- 六种关系中,从弱到强依次是: 依赖关系 < 关联关系 < 聚合关系 < 组合关系 < 实现关系 = 泛化关系
其他:
- 制图工具: staruml专门画UML的
- 或者plantuml 非常好用 https://plantuml.com/activity-diagram-beta
Contact
Feel free to contact me windmillyucong@163.com anytime for anything.