类图
类图 | |
---|---|
术语名称 | 类图 |
英语名称 | class diagram |
描述:
- 系统中可以存在的对象的类型
- 系统中的对象封装什么数据
- 系统中的对象如何互相联系
部分图无法从当前的常见库渲染,不做绘制。
图例
类及其数据和操作
使用矩形表示类(class)。 类总是要写类名,此外为了容纳类中的数据及方法,矩形中绘制水平的分隔线以分隔这三者。
类名
矩形的上方中间写类名。
类名通常是非斜体,抽象类使用斜体。
成员
类的数据域即属性(attributes),由可见性(可选)、名称、重数(可选)、类型(可选)组成。
可见性格式见#可见性,默认为私有。
重数使用括号,其格式见重数,默认为 1 。
若不是实例成员而是类成员,加下划线以示区别。
每个类默认存在一个唯一标记,称为 identity 。通常对应于内存地址或类似信息。
基于美观考虑,以下可见性使用常见的标记:
![]()
操作
类的方法在 UML 中称为操作。 通常情况下,由于单独考虑一个类时很难决定类所需的操作,因此操作会被省略。
操作由'可见性(可选)、名称、参数列表、返回类型组成。
可见性格式见#可见性,默认为公开。
类的操作含有可选的参数列表和返回类型,前者与属性的表示方法相同,后者也是在方法后加括号和类型。
若不是实例成员函数而是类成员函数,加下划线以示区别。若是**抽象**的,使用斜体。
类的重数
即类可能实例化出的对象个数,默认情况下是 `0..*`。对于重数,标记在类的右上角。格式见重数。
注:制图的支持问题,这里不画。
关联
表示两个类之间关系的结构叫做关联(association),用两个类的矩形间连线表示。 两个类之间可以有多个不同名的关联。
关联名及角色
关联可以有名字,如下图所示注明。
线上的是关联的名称/标签(label),线两侧的是这一关联中,两个类各自的角色(role)和重数(multiplicity)。传统上名称常常会使用三角形符号,使得这一带有名字的关联在这一方向上,角色、两侧的名字可以按顺序连接成正确的句子(如图为 employee works for company)。两侧除了角色还有重数,表示一个这一关联的实例中,涉及几个两侧的对象。
角色有可见性标记,见#可见性。一般对应于两侧类中互相访问时,对方使用的成员变量名。
通常不允许同样两个类间有相同名字的两个关系。
关联的方向
上述两个类中使用对方的成员变量名,但是关联不总是双向的。
关联中,对象间可以从哪一个对象访问到哪一个对象、可以对后者发送消息,称为对象间的可导航性(navigability)。 若构成关联的两个对象互相可达,使用上图的直线; 若其中仅有一个对象能到达到对方,使用下图的箭头。
自关联
关联不总是二元的,可以处于同一个类之间,如图。
依赖
不像关联要求一个类的对象可以访问另一方,如果只是一个类使用到另一个类,且改变一个类的接口有可能会改变另一个类,称为依赖(dependency)。
依赖使用类似关联的记号,但是箭头上是虚线。
泛化
类与接口的继承与实现
GSSDS: plantuml/plantuml_derivation
在基类和子类之间画一条空三角箭头,指向基类,且通常画成从下向上的方向。称基类为子类的泛化,子类为基类的特化。
由于特化时自动获得基类的成员,这类成员通常不写出,但如果进行了重写,需要显式列出。
关联的泛化
与父类的关联变成与子类的关联时,在两个关联之间画一个有空三角的箭头。
实现
类似普通的泛化,但是使用虚线。
聚合和组合
尽管对象与对象之间存在关联,可以通过名字表现,但是有部分关联是被特殊处理单独列出的。
聚合
类之间存在一种“部分-整体”语义的关联,称为聚合(aggregation)。
表示方法如图。注意菱形符号在整体一侧。
与普通关联的关系
与普通关联相似,但是聚合关系中,对象的关系额外地加入了限制:
组合
类之间存在一种“部分-整体”语义的关联,且有额外语义“部分”生存周期依赖“整体”存在,随着“整体”消亡而消亡,称为组合(composition)。
表示方法如图。与聚合相似,但是菱形被涂黑。
与普通聚合的关系
组合与普通聚合相似,但是加入了限制:
- 部分的生命周期随整体的建立消亡限制。
- 部分依赖对应的整体,因此通常不会属于多个整体。
强化组合
一个类 A 包含另外两个有关联的类 B、C 时,可以把 B、C 画在 A 的框里。在这种情况下,如果一个 B、C 之间的关联画在 A 的框内部,代表这个关联的对象只能是同一个 A 对象内的两个对象,如果部分离开这个框,则表示可以跨 A 对象。
其它特殊情况
关联类
对应着两个类之间关联的类,画法上是在类和关联之间加一条虚线。
限定关联
某类 A 可达一个 qualifier ,从这个 qualifier 可以确定一个类 B 的对象,这种称为限定关联(qualified association)。
--- --- | A |---- * 0..1| B | | |qual|---------| | | |---- | | --- ---
多继承
菱形继承
UML 中若出现菱形继承,约定后代只包含有一个祖先类的对象。
混入类
叠加在其他类上的附加类。
多元关联
关联可能不只是两个类之间的。
接口
使用 <<interface>>
标注,其成员必然是未实现的,可以不必使用斜体标出。
棒棒糖接口
一般是组件图的符号,但是也有人会用在类图中。特征是用直线和圆圈(棒棒糖)来表示满足某个接口,并用反向圆弧表示这个类会需要什么接口。
一般棒棒糖接口在类图中只用于接口比较局部性,只需要表明相关两个类的对接关系时。
模板/泛型
通常虚线标注在类的上角。
UML / 统一建模语言 | ||
---|---|---|
结构图表 | 静态模型 | 类图、对象图、组件图/构建图 |
源码结构 | 包图 | |
物理结构 | 制品图、部署图 | |
行为图表 | 场景建模 | 用例图、活动图 |
状态建模 | 状态图/状态机图 | |
动态模型 | 交互概览图、通信图、协作图、时序图/顺序图/序列图 |