类图

来自GSXAB的知识库
类图
术语名称 类图
英语名称 class diagram

类图是系统的静态模型的一种,描述之间的关系。

描述:

  • 系统中可以存在的对象的类型
  • 系统中的对象封装什么数据
  • 系统中的对象如何互相联系

部分图无法从当前的常见库渲染,不做绘制。

图例

类及其数据和操作

使用矩形表示(class)。 类总是要写类名,此外为了容纳类中的数据及方法,矩形中绘制水平的分隔线以分隔这三者。

plantuml_class.svg

类名

矩形的上方中间写类名。

类名通常是非斜体抽象类使用斜体

成员

类的数据域即属性(attributes),由可见性(可选)、名称重数(可选)、类型(可选)组成。

可见性格式见#可见性,默认为私有。

重数使用括号,其格式见重数,默认为 1 。

若不是实例成员而是类成员,加下划线以示区别。

plantuml_class_symbol.svg

每个类默认存在一个唯一标记,称为 identity 。通常对应于内存地址或类似信息。

基于美观考虑,以下可见性使用常见的标记:

plantuml_class_attribute.svg

操作

类的方法在 UML 中称为操作。 通常情况下,由于单独考虑一个类时很难决定类所需的操作,因此操作会被省略。

操作由'可见性(可选)、名称参数列表返回类型组成。

可见性格式见#可见性,默认为公开。

类的操作含有可选的参数列表和返回类型,前者与属性的表示方法相同,后者也是在方法后加括号和类型。

plantuml_class_method.svg

若不是实例成员函数而是类成员函数,加下划线以示区别。若是**抽象**的,使用斜体。

类的重数

即类可能实例化出的对象个数,默认情况下是 `0..*`。对于重数,标记在类的右上角。格式见重数

注:制图的支持问题,这里不画。

关联

表示两个类之间关系的结构叫做关联(association),用两个类的矩形间连线表示。 两个类之间可以有多个不同名的关联。

关联名及角色

关联可以有名字,如下图所示注明。

plantuml_relation_role.svg

线上的是关联的名称/标签(label),线两侧的是这一关联中,两个类各自的角色(role)和重数(multiplicity)。传统上名称常常会使用三角形符号,使得这一带有名字的关联在这一方向上,角色、两侧的名字可以按顺序连接成正确的句子(如图为 employee works for company)。两侧除了角色还有重数,表示一个这一关联的实例中,涉及几个两侧的对象。

角色有可见性标记,见#可见性。一般对应于两侧类中互相访问时,对方使用的成员变量名。

通常不允许同样两个类间有相同名字的两个关系。

关联的方向

上述两个类中使用对方的成员变量名,但是关联不总是双向的。

关联中,对象间可以从哪一个对象访问到哪一个对象、可以对后者发送消息,称为对象间的可导航性(navigability)。 若构成关联的两个对象互相可达,使用上图的直线; 若其中仅有一个对象能到达到对方,使用下图的箭头。

plantuml_relation_navigability.svg

自关联

关联不总是二元的,可以处于同一个类之间,如图。

plantuml_relation_self.svg

依赖

不像关联要求一个类的对象可以访问另一方,如果只是一个类使用到另一个类,且改变一个类的接口有可能会改变另一个类,称为依赖(dependency)。

依赖使用类似关联的记号,但是箭头上是虚线。

泛化

类与接口的继承与实现

GSSDS: plantuml/plantuml_derivation

基类子类之间画一条空三角箭头,指向基类,且通常画成从下向上的方向。称基类为子类的泛化,子类为基类的特化

由于特化时自动获得基类的成员,这类成员通常不写出,但如果进行了重写,需要显式列出。

关联的泛化

与父类的关联变成与子类的关联时,在两个关联之间画一个有空三角的箭头。

实现

类似普通的泛化,但是使用虚线。

plantuml_implementation.svg

聚合和组合

尽管对象与对象之间存在关联,可以通过名字表现,但是有部分关联是被特殊处理单独列出的。

聚合

类之间存在一种“部分-整体”语义的关联,称为聚合(aggregation)。

表示方法如图。注意菱形符号在整体一侧。

plantuml_aggregation.svg

与普通关联的关系

与普通关联相似,但是聚合关系中,对象的关系额外地加入了限制:

  1. 传递性:对象A包含B,对象B包含C,则认为A包含C。
  2. 反对称:如果一个类上有一个一元聚合,对应的对象关系不能是自己和自己发生关联。

组合

类之间存在一种“部分-整体”语义的关联,且有额外语义“部分”生存周期依赖“整体”存在,随着“整体”消亡而消亡,称为组合(composition)。

表示方法如图。与聚合相似,但是菱形被涂黑。

plantuml_combination.svg

与普通聚合的关系

组合与普通聚合相似,但是加入了限制:

  1. 部分的生命周期随整体的建立消亡限制。
  2. 部分依赖对应的整体,因此通常不会属于多个整体。

强化组合

一个类 A 包含另外两个有关联的类 B、C 时,可以把 B、C 画在 A 的框里。在这种情况下,如果一个 B、C 之间的关联画在 A 的框内部,代表这个关联的对象只能是同一个 A 对象内的两个对象,如果部分离开这个框,则表示可以跨 A 对象。

其它特殊情况

关联类

对应着两个类之间关联的类,画法上是在类和关联之间加一条虚线。

plantuml_relation_class.svg

限定关联

某类 A 可达一个 qualifier ,从这个 qualifier 可以确定一个类 B 的对象,这种称为限定关联(qualified association)。

 ---                ---
| A |---- *    0..1| B |
|   |qual|---------|   |
|   |----          |   |
 ---                ---

多继承

plantuml_multiple_inheriting.svg

菱形继承

UML 中若出现菱形继承,约定后代只包含有一个祖先类的对象。

plantuml_diamond_inheriting.svg

混入类

叠加在其他类上的附加类。

多元关联

关联可能不只是两个类之间的。

接口

使用 <<interface>> 标注,其成员必然是未实现的,可以不必使用斜体标出。

棒棒糖接口

一般是组件图的符号,但是也有人会用在类图中。特征是用直线和圆圈(棒棒糖)来表示满足某个接口,并用反向圆弧表示这个类会需要什么接口。

plantuml_lolipop_interface.svg

一般棒棒糖接口在类图中只用于接口比较局部性,只需要表明相关两个类的对接关系时。

模板/泛型

通常虚线标注在类的上角。


UML / 统一建模语言
结构图表 静态模型 类图对象图组件图/构建图
源码结构 包图
物理结构 制品图、部署图
行为图表 场景建模 用例图活动图
状态建模 状态图/状态机图
动态模型 交互概览图、通信图协作图时序图/顺序图/序列图