本文用足够简单的语言记录UML的常用内容。想看一本书去专门学习UML,这样的书大多不会专门只写UML,一本书里还会包含其他的知识,比如面向对象设计,结合UML知识,内容上一半一半。在我看来,学习UML可以辅助我们去理解系统概貌,比如研读Spring框架的时候,通过画图能更好的理解它的设计思路,用图的视角读懂spring框架;同时能让我在技术开发工作中,写技术方案的时候,方案内容更丰富,更容易把方案传达给同事,思路更加清晰。
一、为什么需要 UML
UML定义:统一建模语言,是描述、构造和文档化系统制品的可视化语言。
使用 UML 的面向对象图的方式来更明确、清晰的表达项目中的架设思想、项目结构、执行顺序等一些逻辑思维。
图可以帮助我们更为便利地观察全景,发现软件元素、分析之间的联系,同时允许我们忽略或者影藏旁枝末节,
1.1 UML 的目标
-
UML 被定义为一个简单的建模机制,帮助我们按照实际情况或者按照我们需要的样式对系统进行可视化;
-
提供一种详细说明系统的结构或行为的方法;
-
给出一个指导系统构造的模板;
-
对我们所做出的决策进行文档化。
二、UML 基本元素
2.1 三个基本模块
事务,关系,图。
-
事物:UML模型中最基本的构成元素,是具有代表性的成分的抽象,比如类、接口、用例、节点、交互、组件、包、注释等都称为事物
-
关系:关系把事物紧密联系在一起
-
图:图是事物和关系的可视化表示
2.2 四种关系
-
依赖
-
关联
-
实现
-
泛化
2.3 十种图
-
静态模型图: 描述系统的静态结构
类图、对象图、包图、部署图、组件图
-
动态模型图: 描述系统行为的各个方面
用例图、活动图、状态图、序列图、协作图
三、UML图
3.1 类图
类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。
在解读开源框架或者接触新系统的时候,比较适合用来研读框架或者系统。
在类图中,常见的有以下几种关系:
-
【泛化关系】是一种继承关系,表示子类继承父类的所有特征和行为。
-
【实现关系】是一种类与接口的关系,表示类是接口所有特征和行为的实现。
-
【关联关系】是一种拥有关系,它使得一个类知道另一个类的属性和方法。【代码体现】成员变量
-
【聚合关系】是一种整体与部分的关系。且部分可以离开整体而单独存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分。【代码体现】成员变量
-
【组合关系】是一种整体与部分的关系。但部分不能离开整体而单独存在,组合关系是关联关系的一种,是比聚合关系还要强的关系。【代码体现】成员变量
-
-
【依赖关系】是一种使用关系,即一个类的实现需要另一个类的协助。
Idea开发工具,生成的类图
3.2 对象图
UML 对象图显示某时刻对象和对象之间的关系。
UML 对象图是类图的实例,几乎使用与类图完全相同的标识。
由于对象存在生命周期,因此UML对象图只能在系统某一时间段存在。
以上Company是一个类,冒号前面的ci就是这个类实例化成对象之后,对象的一个名字,此对象内部有一个变量name,赋值为blueFire,对象图仅此而已,平常使用频率也很低。
3.3 包图
概念:描绘了系统在包层面上的结构设计。
目的:用来表示包和包之间的依赖关系。
大包可以包含小包,虚线箭头上的文字说明了包和包之间存在依赖和调用关系。包图如此简单
3.4 部署图
部署图由节点以及节点之间的关系组成。节点是带有至少一个处理器、内存以及可能还带有其他设备的处理元素、一般来说服务器、客户机都可以是称为节点
部署图描述的是系统运行时的结构,展示了硬件的配置及其软件如何部署到网络结构中。
部署图通常用来帮助理解分布式系统。
主要就是由节点、组件和直线三者组成,节点和节点之间,节点和组件之间直接用直接连接。一些书上把组件叫做制品。
我们自己开发的代码或者比较小一点的程序,我习惯称之为组件,组件这个词没有明确的边界界定,就如上图中所示,自己开发的jar包是一个组件,自己写的一段Python脚本部署在服务器上也可称之为一个组件。
直线连接线上可以标识出两个节点或者组件之间通信采用的协议,比如http协议、TCP协议等。
部署图一般都是在新系统设计完成之后,系统上线之前,部署就大致确定了,这样可以看清楚系统的实际的部署情况,比如部署几台服务器,服务器配置等。如果有架构调整,或者新功能的加入,部署图会做出相应调整。系统上线之后,基本很少变化。
《UML和模式应用(原书第3版)》教材上部署图:
3.5 组件图
不常用,忽略
3.6 用例图
概念:用例图是指由参与者、用例,边界以及它们之间的关系构成的用于描述系统功能的视图。
用例图中包含以下三种关系:
包含关系使用符号《include》,想要查看列表,前提是需要先登录。
扩展关系使用符号《extend》,基于查询订单列表的功能,可以增加一个导出数据的功能
泛化关系,子用例继承父用例所有结构、行为和关系。
3.7 活动图
概念:描述了具体业务用例的实现流程。
椭圆代表一个动作或者一段代码逻辑;菱形代表条件判断;黑色实体圆圈代表开始;黑色实体圆圈+外圈代表结束;红色加粗实线代表存在并行动作。
3.8 状态图
概念:状态图对一个单独对象的行为建模,指明对象在它的整个生命周期里,响应不同事件时,执行相关事件的顺序。
目的:用来表示指定对象,在整个生命周期,响应不同事件的不同状态。
缴费业务订单状态图:
以上是一个订单的在流转过程中,当某一个事件触发之后,状态发生的变化。
方形代表一个状态,黑色实体圆圈代表订单流转开始,状态和状态之间用实线箭头连接,箭头上的文字描述代表一个事件触发。
从状态图上可以看出的重要信息有:
1、哪些状态是终态,正常来说,已经流转到终态的订单,是不能继续流转了,不然会出现死循环
2、订单所有的流转状态,以及触发的事件
3、如果添加新的状态进去,会对流转造成哪些影响
3.9 时序图
概念:序列图根据时间序列展示对象如何进行协作。它展示了在用例的特定场景中,对象如何与其他对象交互。
目的:通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。
明厨亮灶商户和设备绑定时序图:
小人代表参与者,通常指某个角色;
虚线顶部的长方形代表某个系统、或者某个组件、或者某个服务;
虚线上的长方条代表一个方法或者一个动作,它的长度代表这个方法的生命线,即方法执行的需要的时间长度,在这个时间长度内,做了哪些其他动作或者调用了哪些其他方法。
实线箭头代表动作发起,动作上可以有括号,括号内部可以有参数说明,比如发送短信(手机号,短信内容);虚线箭头代表返回值。
画时序图可概要,可详细,概要一般是表达整个需求的大致流程和步骤,虚线顶部的长方形就可以表示系统和系统之间的交互,详细一般是一个大需求里某一段逻辑,虚线顶部的长方形就可以表示某一个服务类、MQ、数据库等组件之间的交互。
makedown编辑器代码编写时序图
时序图中还可以体现出逻辑判断,比如上图中的opt就代码if判断,alt就代表if else判断,loop就代表for或者while循环
3.10 协作图
不常用,忽略
四、我的用途
-
编写技术方案
-
阅读源码,剖析框架
五、UML工具
-
飞书文档
-
微软 Visio
-
Processon https://www.processon.com/
-
Markdown 编辑器
-
OmniGraffle
六、结语
UML只是一种标准的、可视化的建模语言,了解它的细节并不能教会你如何用对象思想来思考
面向对象设计原则:单一职责原则、开闭原则、合成复用原则等