在总结设计模式的时候,经常需要通过它们的 UML
图来更整体的了解设计模式的代码结构,这篇文章主要就是总结 UML
的一些相关知识
定义
统一建模语言(英语:Unified Modeling Language,缩写 UML) 是非专利的第三代建模和规约语言。UML 是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML 展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在 软件架构 层次已经被验证有效。
UML 涉及的知识太多,我主要挑选我用到的知识进行部分延展
图形
UML2.0 一共定义了14种图形,根据各个图形的侧重点,分成3大类
- 结构型图形(Structure diagrams): 强调的是系统式的建模
- 静态图(static diagram),包括
类图
,对象图
,包图
- 实现图(implementation diagram), 包括
组件图
,部署图
剖面图
复合结构图
- 静态图(static diagram),包括
- 行为型图形(Behavior diagrams): 强调系统模型中触发的时间
活动图
状态图
用例图
- 交互性图形(Interaction diagrams): 属于行为图形的子集合,强调系统模型中的资料流程
通信图
交互概述图
时序图
时间图
具体每种图对应的细节,感兴趣的可以看看 《UML用户指南(第2版)》
CSDN下载地址: https://download.csdn.net/download/shenzhq1980/9150941 (扫描版,积分不够的,建议直接淘宝找店家)
类图
因为在学习设计模式的时候提到的 UML 图都是类图,所以接下来,主要介绍类图相关的知识
类图是软件工程的统一建模语言一种静态结构图,该图描述了系统的类集合,类的属性和类之间的关系。
类
类(Class)一般包含3个组成部分。
- 第一个是类名;
- 第二个是属性(attributes);
- 第三个是该类提供的方法( 类的性质可以放在第四部分;如果类中含有内部类,则会出现第五个组成部分)。
类名部分是不能省略的,其他组成部分可以省略。一般情况下类的画法如下图:
类名书写规范:正体字说明类是可被实例化的,斜体字说明类为抽象类。
属性和方法书写规范:
属性: 修饰符 属性对象 : 类型 = 默认值
方法: 修饰符 方法名称(函数参数:参数类型 = 默认值): 返回类型
注意: 属性的参数没有默认值 或者 方法没有传入参数或者传入参数没有默认值、方法没有返回类型都可以按照实际情况省略
属性和方法之前可附加的可见性修饰符:
符号 | 表示 |
---|---|
+ | 表示 public |
- | 表示 private |
# | 表示 protected |
~ | (Java)包权限(即对包内其他成员可见) |
_ | 下划线表示 static |
/ | 推导,由其他属性推导得出,不需要直接给定其值 |
关系
一般来说,2个类之间的关系有6种:
- 泛化(Generalization)
- 实现(Realization)
- 依赖(Dependency)
- 关联(Association)
- 聚合(Aggregation)
- 组合(Composition)
按照列举的顺序逐个介绍这6种关系
泛化
继承:子类具有父类的属性和方法或者重新定义、追加属性和方法等
泛化,即继承的反方向,指的是一个类(称为父类、父接口)具有另外的一个(或一些)类(称为子类、子接口)的共有功能。子类可视为其父类的特例,并可以增加新功能。
箭头指向: 带空心三角箭头的实线,箭头指向父类
实现
实现(Realization)指的是一个class类实现接口的功能
这里的实现主要就是针对接口:
C++的接口是要满足下面的条件的:
- 类中没有定义任何的成员变量
- 所有的成员函数都是公有的
- 所有的成员函数都是纯虚函数
- 接口是一种特殊的抽象类
箭头指向: 带空心三角箭头的虚线,箭头指向接口
依赖
依赖关系(Dependency)可以简单的理解为一个类A使用到了另一个类B, 被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。而这种使用关系是具有偶然性、临时性的、非常弱的,但是B类的变化会影响到A;代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。
依赖关系仅仅描述了类与类之间的一种使用与被使用的关系。
箭头指向:带燕尾箭头的虚线,箭头从使用类指向被依赖的类。
关联
关联关系(Association)使一个类知道另外一个类的属性和方法;通常含有“知道”、“了解”的含义。关联关系可以是单向的,也可以是双向的。双向的关联可以有箭头或是没有箭头,单向的只有一个箭头。
箭头指向:实线,根据关联的关系,决定燕尾箭头指向。
聚合
聚合(Aggregate)是表示整体与部分的一类特殊的关联关系,是 “弱” 的包含关系,成分类可以不依靠聚合类而单独存在。例如大雁和雁群,池塘和池塘里的鸭子等等
箭头指向:带空心菱形的实线,菱形指向整体,燕尾箭头指向部分。
组合
组成(Composition)关系,是一类 “强” 的整体与部分的包含关系。成分类必须依靠合成类而存在。整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。合成类别完全拥有成分类别,负责创建、销毁成分类别。例如公司与公司部门,鸟和鸟的翅膀等等
箭头指向:带实心菱形的实线,菱形指向整体,燕尾箭头指向部分。
类之间的关系其实可以在进一步划分一下
- 有 “上下级” 关系的泛化和实现: 都是空心三角箭头,都是指向 “上级”, 但上级是接口虚线,上级是类实线
- 一个类使用另一个类的依赖和关联: 燕尾箭头都是指向被使用的类,但使用关系的程度比较弱,就是虚线,反之就是实线
- 整体和部分关系的聚合和组合:都是实线,燕尾箭头指向部分,但成分类可独立存在,空心菱形指向整体, 部分整体不可分,实心菱形指向整体
工具
关于 UML
我在使用过程中遇到的一些知识大概就这么多了,最后介绍几款我在绘制 UML
使寻找的一些工具,下面介绍的几个感觉都很强大好用:
- 网页在线绘制的
ProcessOn
https://www.processon.com 绘制简单的UML大材小用,也能做更多思维导图,流程图等等的设计,免费就够用 - 亿图图示
直接官网下载客户端,全平台,模板很丰富,功能异常强大,但是试用版导出会有水印等小问题 drawio
网页版,客户端都有,是 github 上的一个开源项目: https://github.com/jgraph/drawio
网页版地址: https://app.diagrams.net/
客户端下载地址: https://github.com/jgraph/drawio-desktop/releases/tag/v13.9.8