在总结设计模式的时候,经常需要通过它们的 UML 图来更整体的了解设计模式的代码结构,这篇文章主要就是总结 UML 的一些相关知识

定义

统一建模语言(英语:Unified Modeling Language,缩写 UML) 是非专利的第三代建模和规约语言。UML 是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML 展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在 软件架构 层次已经被验证有效。

UML 涉及的知识太多,我主要挑选我用到的知识进行总结

图形

UML2.0 一共定义了14种图形,根据各个图形的侧重点,分成3大类

uml模型转换java代码后用什么封装 uml类图转代码_绘制该机票预定系统的类图。

  • 结构型图形(Structure diagrams):强调的是系统式的建模
  • 静态图(static diagram),包括 类图对象图包图
  • 实现图(implementation diagram), 包括 组件图部署图
  • 剖面图
  • 复合结构图
  • 行为型图形(Behavior diagrams):强调系统模型中触发的时间
  • 活动图
  • 状态图
  • 用例图
  • 交互性图形(Interaction diagrams):属于行为图形的子集合,强调系统模型中的资料流程
  • 通信图
  • 交互概述图
  • 时序图
  • 时间图

具体每种图对应的细节,感兴趣的可以看看 《UML用户指南(第2版)》

类图

因为在学习设计模式的时候提到的 UML 图都是类图,所以接下来,主要介绍类图相关的知识

类图是软件工程的统一建模语言一种静态结构图,该图描述了系统的类集合,类的属性和类之间的关系。

类(Class)一般包含3个组成部分。

  • 第一个是类名;
  • 第二个是属性(attributes);
  • 第三个是该类提供的方法( 类的性质可以放在第四部分;如果类中含有内部类,则会出现第五个组成部分)。

类名部分是不能省略的,其他组成部分可以省略。一般情况下类的画法如下图:

uml模型转换java代码后用什么封装 uml类图转代码_绘制该机票预定系统的类图。_02

类名书写规范:正体字说明类是可被实例化的,斜体字说明类为抽象类

属性和方法书写规范:

属性: 修饰符 属性对象 : 类型 = 默认值
方法:修饰符 方法名称(函数参数:参数类型 = 默认值): 返回类型

注意:属性的参数没有默认值 或者 方法没有传入参数或者传入参数没有默认值、方法没有返回类型都可以按照实际情况省略

属性和方法之前可附加的可见性修饰符:

符号

表示

+

表示 public

-

表示 private

#

表示 protected

~

(Java)包权限(即对包内其他成员可见)

_

下划线表示 static

/

推导,由其他属性推导得出,不需要直接给定其值

关系

一般来说,2个类之间的关系有6种:

  • 泛化(Generalization)
  • 实现(Realization)
  • 依赖(Dependency)
  • 关联(Association)
  • 聚合(Aggregation)
  • 组合(Composition)

按照列举的顺序逐个介绍这6种关系

泛化

继承:子类具有父类的属性和方法或者重新定义、追加属性和方法等

泛化,即继承的反方向,指的是一个类(称为父类、父接口)具有另外的一个(或一些)类(称为子类、子接口)的共有功能。子类可视为其父类的特例,并可以增加新功能。

箭头指向:带空心三角箭头的实线,箭头指向父类

uml模型转换java代码后用什么封装 uml类图转代码_UML_03

实现

实现(Realization)指的是一个class类实现接口的功能

这里的实现主要就是针对接口:

C++的接口是要满足下面的条件的:

  • 类中没有定义任何的成员变量
  • 所有的成员函数都是公有的
  • 所有的成员函数都是纯虚函数
  • 接口是一种特殊的抽象类

箭头指向:带空心三角箭头的虚线,箭头指向接口

uml模型转换java代码后用什么封装 uml类图转代码_uml模型转换java代码后用什么封装_04

依赖

依赖关系(Dependency)可以简单的理解为一个类A使用到了另一个类B, 被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。而这种使用关系是具有偶然性、临时性的、非常弱的,但是B类的变化会影响到A;代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。

依赖关系仅仅描述了类与类之间的一种使用与被使用的关系。

箭头指向:带燕尾箭头的虚线,箭头从使用类指向被依赖的类

uml模型转换java代码后用什么封装 uml类图转代码_uml模型转换java代码后用什么封装_05

关联

关联关系(Association)使一个类知道另外一个类的属性和方法;通常含有“知道”、“了解”的含义。关联关系可以是单向的,也可以是双向的。双向的关联可以有箭头或是没有箭头,单向的只有一个箭头。

箭头指向:实线,根据关联的关系,决定燕尾箭头指向

uml模型转换java代码后用什么封装 uml类图转代码_UML_06

聚合

聚合(Aggregate)是表示整体与部分的一类特殊的关联关系,是 “” 的包含关系,成分类可以不依靠聚合类而单独存在。例如大雁和雁群,池塘和池塘里的鸭子等等

箭头指向:带空心菱形的实线,菱形指向整体,燕尾箭头指向部分

uml模型转换java代码后用什么封装 uml类图转代码_uml模型转换java代码后用什么封装_07

组合

组成(Composition)关系,是一类 “” 的整体与部分的包含关系。成分类必须依靠合成类而存在。整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。合成类别完全拥有成分类别,负责创建、销毁成分类别。例如公司与公司部门,鸟和鸟的翅膀等等

箭头指向:带实心菱形的实线,菱形指向整体,燕尾箭头指向部分

uml模型转换java代码后用什么封装 uml类图转代码_UML_08

类之间的关系其实可以在进一步划分一下

  • 有 “上下级” 关系的泛化和实现:都是空心三角箭头,都是指向 “上级”, 但上级是接口虚线,上级是类实线
  • 一个类使用另一个类的依赖和关联:燕尾箭头都是指向被使用的类,但使用关系的程度比较弱,就是虚线,反之就是实线
  • 整体和部分关系的聚合和组合:都是实线,燕尾箭头指向部分,但成分类可独立存在,空心菱形指向整体, 部分整体不可分,实心菱形指向整体

工具

关于 UML 我在使用过程中遇到的一些知识大概就这么多了,最后介绍几款我在绘制 UML 过程中寻找的一些工具:

  • 网页在线绘制的 ProcessOnhttps://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