UML是Unified Modeling Language缩写,译为统一建模语言,UML教程 https://sparxsystems.com/resources/tutorials/uml2/index.html
UML规范定义了两种主要的UML图,分别为结构图和行为图。
结构图:显示了系统及其部件在不同抽象和实现级别上的静态结构以及它们如何相互关联。结构图中的元素表示系统的有意义的概念,并且可以包括抽象的,现实的和实现的概念。包括:类图、对象图、包图、组件图、复合结构图、部署图、配置文件图。
行为图:显示了系统中对象的动态行为,可以将其描述为系统随时间的一系列更改。包括:用例图、活动图、状态图、顺序图、时序图、通信图、交互概览图
可以总结让deepseek基于Markdown 编写UML图,比较清晰
1、类图
| 关系类型 | 英文 | 符号 | 图标示意 | 箭头方向 | 生命周期 |
|---|---|---|---|---|---|
| 继承 | Generalization | 空心三角 + 实线 | ▷─── |
子类 → 父类 | 父类先存在,子类基于父类创建;父类销毁不影响子类; 模版 |
| 实现 | Realization | 空心三角 + 虚线 | ▷ - - - |
实现类 → 接口 | 接口(纯虚函数)定义契约,实现类遵循契约;两者生命周期独立 |
| 关联 | Association | 普通箭头 + 实线 | ─────▶ |
使用方 → 被使用方 | 两者生命周期独立,被使用方可被多个使用方共享 |
| 聚合 | Aggregation | 空心菱形 + 实线 | ◇───── |
部分 → 整体 | 部分可独立于整体存在(整体销毁,部分仍可复用) |
| 组合 | Composition | 实心菱形 + 实线 | ◆───── |
部分 → 整体 | 部分随整体同生共死(整体销毁,部分也随之销毁) |
| 依赖 | Dependency | 普通箭头 + 虚线 | - - - ▶ |
依赖方 → 被依赖方 | 临时关系,仅在方法调用期间存在 |
快速记忆口诀
三角父子实线继,虚线接口得实现。
菱形零件空心聚,实心组合共生死。
实线关联长期友,虚线依赖用完走
理解
只有普通箭头和空心箭头,并没有实心箭头。
箭头方向使用者到被使用者,所以是子类 --> 父类(基类),实例化函数 --> 模板函数,实现类到接口,实现层:算子策略--> 算子(策略实现需要读取算子参数、结构),抽象层:算子-->策略(算子可选用策略,策略实现不依靠算子信息)
虚线的依赖是临时的,比如绑定,call, 创建,use
绑定:外部注入,可替换,因此不是长期的
绑定 VS 实例化:Bind是静态的,实例化是运行时的
模版只能是继承,因为不可能定义虚函数
UML 聚合 (Aggregation) 面向对象设计 整体-部分关系,部分可脱离整体(空心菱形)
C 语言的"聚合数据类型" C 语言标准 指 struct、union、array(把多个数据组合成复合类型)
==> 在 UML 层面 :结构体(struct)和联合体(union)都可能表现为组合 ,也可能表现为聚合
1. 继承(Generalization):有复用、扩展父类代码
- 关系:子类 → 父类
- 图标:空心三角 + 实线
- 场景:
- 普通类继承:
class B : public A - 模板类继承:
template<class T> class B : public A<T>
- 普通类继承:
2. 实现(Realization):不复用父类代码
- 关系:类 → 接口 / 纯抽象类
- 图标:空心三角 + 虚线
- 场景:
- 含有纯虚函数的抽象接口,子类完整实现所有接口方法
3. 某个类 / 函数 使用、调用、实例化 模板
属于:依赖(Dependency)
- 线条:普通箭头 + 虚线
- 场景:仅是简单的使用,这里的模版和普通对象没有区别
- 简单的使用了模版类 void func() { vector<int> a; }
时序图的两个核心维度
| 维度 | 表现形式 | 含义 |
|---|---|---|
| 时间轴 | 从上到下 | 时间递增,越往下时间越晚 |
| 箭头 | ->> / -->> |
消息传递(调用或返回) |
| 方框 | activate / deactivate |
正在执行(占用执行资源) |
| 环形箭头 | A->>A: 自调用 |