看网上有很多关于 UML 图的介绍,但都不完整,于是参考了一些 UML 书籍、博客、视频、官网,并基于最新的 UML 2.5 版本(涵盖了 UML 14 种图),总结了这篇文章,希望能给系统分析设计的同学一点参考。
本文分为上下两篇,主要讲解 UML 核心图的结构和一些案例,偏向于操作介绍,如果发现本篇文章有任何问题,或在使用 UML 画图过程中遇到问题,欢迎留言评论。
UML 全称 Unified Modeling Language,即统一建模语言,是软件工程领域中一种通用的、开发性的建模语言,它不是一种程序设计语言,旨在提供一种标准的方法来可视化系统的设计。它比 C++、Java 这样的程序设计语言抽象层次更高,可以适用于任何面向对象的程序设计语言。这种建模语言已经得到了工业界的广泛支持和应用,并已被 ISO 确立为国际标准。
统一建模语言是由对象管理组织(Object Management Group, OMG)制定的一个通用的、可视化的建模语言标准,可以用来可视化、描述、构造和文档化软件密集型系统的各种工件。它是由信息系统和面向对象领域的 3 位著名的方法学家 Grady Booch、James Rumbaugh 和 Ivar Jacobson(threeAmigos,三友)提出的。
在面向对象的软件开发中,选择 UML 已经成了必然的趋势。面向对象专家 Martin Flower 曾经这样说过:“如果正在使用其他的旧技术建模,我强烈建议您马上转用 UML,因为它明显地将成为符号系统的统一标准。如果正在考虑开始使用设计符号来工作,UML 是一个好的选择,因为它已经统治业界了。”在很多情况下,开发人员都应该选择 UML 作为建模语言。
作为一种统一建模语言,UML 的统一并不仅仅是三大面向对象方法的统一,还合并了许多面向对象方法中被普遍接受的概念,对每一种概念,UML 都给出了清晰的定义、表示法和有关术语。
UML 的诞生经历了一个漫长的历程。从 20 世纪 80 年代初期开始,众多的方法学家都在尝试用不同的方法进行面向对象的分析与设计。当时,许多方法开始在一些项目中发挥作用,如 Booch、OMT、Shlaer/Mellor、Odell/Martin、RDD、Objectory 等方法。到了 20 世纪 90 年代中期出现了比较完善的面向对象方法,知名的有 Booch 94、OMT 2、OOSE、Fusion 等方法,那时面向对象方法已经成为软件分析和设计方法的主流。
目前,UML 主要存在 UML 1.x 和 UML 2 两个大的版本系列。UML 1.x 主要是指 UML 1.0~UML 1.5 的这几个版本,版本之间有一些差别,但总体差别不大。而 UML 2 则是指从 2005 年正式发布的 UML 2 之后的各个版本。
相比 UML 1.x,UML 2 的变化很大,首先是结构的调整,从 UML 2 开始,UML 标准被划分为两个相对独立的部分:基础结构和上层结构;其次内容上也有很大的变化,包括底层概念的统一、各种图形的改进和增加等。目前,UML 2 已经成为发展趋势。
早期的 UML 1.x 只提供了 9 种图形。包图、组合结构图、外廓图、交互概览图、时间图这 5 种是在 UML 2 中新增的(外廓图是在 UML 2.3 之后才有的);而通信图则是由 UML 1.x 的协作图改名而来,其他的一些图形也做了适当的调整和扩充。
本篇文章的核心图介绍采用最新的 UML 2.5 作为建模语言。
UML的分类 PRODUCT
UML 即然是一种语言,那么它必然有语义结构,下图来自 UML 2.5 规范,列出了 UML 语义域分层的详细分解结构。
按照 UML 的语义结构,可以将 UML 划分为三大类,结构建模(Structural Modeling)、行为建模(Behavioral Modeling)、补充建模(Supplemental Modeling)
动作(Actions)是 UML 中的基本行为单元,用于定义细粒度的行为;在此基础上形成高层次的行为机制,包括状态机(StateMachines)、活动(Activities)和交互(Interactions)等。
既有结构化又有行为的辅助建模结构,包括用例(Use Cases)、部署(Deployments)和信息流(Information Flows)。
目前最新的UML 2 中有 14 种图,相比 UML 1.x 新增了 5 种图(包图、组合结构图、外廓图、交互概览图、时间图),按照静态结构和动态行为划分如下:
静态结构图的主元素是静态元素,如类图的类、接口;
动态行为图的主元素是动态元素,如活动图的主元素是用例的动作
(下图来自 wikipedia)
动态行为图(7 种)
对象交互图
对象之间的信息交互的图(交互图)
强调消息执行顺序:顺序图(时序图)
强调对象之间的协作:通信图(协作图)
强调真实时间信息:时间图
交互图之间的执行顺序:交互概览图
对象和对象目标之间的关系:用例图
事物执行的控制流和数据流:活动图
对象自身经历的状态转移:状态图
静态结构图(7 种)
包和包之间的关系:包图
系统的类/接口的协作和关系:类图
对象和对象之间的关系的图:对象图
系统某一部分的内部结构:组合架构图
构件展示及构件相互依赖关系:构件图
构件在各节点部署的展示:部署图
现有图的扩展:外廓图
它们的共同点有以下几个:
描述系统中单个或多个事物动态行为特性
交互图(顺序图、通信图、交互概览图、时间图)侧重描述事物间的交互过程
行为图(活动图、状态机图)侧重描述事物本身的行为特征
它们的区别主要体现在每种图形的侧重点不同:
交互图(顺序图、通信图):适合描述单个用例中多个对象之间的协作行为。
交互概览图:用于描述复杂用例多个顺序图间的控制流程。
时间图:用于描述时间受控的单个或多个对象间状态交互。
状态机图:适合描述跨越多个用例的单个对象的行为如何影响该对象的状态。
活动图:适合描述多个对象跨越多个用例时的总貌。
(2)用例建模:采用 UML 用例建模技术描述软件需求,该需求模型将为后续用例分析提供输入。
(3)用例分析:采用 UML 用例分析技术分析软件需求,建立软件系统的分析模型。
(4)架构设计:在系统的全局范围内,以分析模型为基础,设计系统的架构。
(5)构件设计:根据架构设计的成果,将分析模型细化,设计系统构件的实现细节。
(6)代码实现:将系统构件映射到目标语言上。
下面将从“作用”、“组成元素”、“示例”三个维度介绍每个 UML 图用法
静态结构图(7种) PRODUCT
1.1、作用
类图(Class Diagram)是软件的蓝图,用于详细描述系统内各个对象的相关类,以及这些类之间的静态关系;
1.2、组成元素
组成元素 |
符号 |
类 |
例子: |
接口 |
|
对象 |
|
关系 |
依赖(Dependency) |
关联(Association) |
|
聚合(Aggregation) |
|
组合(Composition) |
|
泛化(Generalization) |
|
实现(Realization) |
1.3、示例
(1)图书馆管理系统类图
2.1、作用
包图(Package Diagram)用于展现由模型本身分解而成的组织单元(包)及它们的依赖关系
核心概念
包(框架、层、子系统)
依赖
2.2、组成元素
组成元素 |
符号 |
包(Package) |
|
关系 |
依赖(Dependency) |
关联(Association) |
|
聚合(Aggregation) |
|
组合(Composition) |
|
泛化(Generalization) |
|
实现(Realization) |
2.3、示例
在图书馆管理系统中,如上图所示,系统高层分为 3 层,其中界面层负责用户交互;数据访问层负责访问底层信息;业务逻辑层负责协调界面层和数据访问层间的访问逻辑。此外,对于数据访问层内部,又可以采用分包的方式进行逻辑划分,如图右半部分所示,分为借阅包、读者包、图书包。
3.1、作用
对象图(Object Diagram)用于表示在某一时刻,类的对象的静态结构和行为;
核心概念
对象、链接、多重性
3.2、组成元素
组成元素 |
符号 |
对象(Object) |
|
关系 |
依赖(Dependency) |
关联(Association) |
|
聚合(Aggregation) |
|
组合(Composition) |
|
泛化(Generalization) |
|
实现(Realization) |
3.3、示例
(1)某教职工借阅信息对象图
4.1、作用
组合结构图(Composite Structure Diagram)用于描述系统中某一部分(组合结构)的内部结构,包括该部分与系统其他部分的交互点。
核心概念
组合结构、部件、端口、角色绑定。
4.2、组成元素
组成元素 |
符号 |
部件(Part) |
|
端口(Port) |
|
协作(Collaboration) |
|
连接(Connector) |
|
角色绑定(Role binding) |
4.3、示例
(1)借书过程的组合结构图
为了完成系统所需的某些功能(如借书),需要几个类之间进行相互协作,而这几个类就构成了一个组合结构。为了完成借书的功能,这些类之间存在着一定的接口(组合结构图中称为端口)和连接,这些信息即可通过组合结构图来反映。上图展示了借书过程的组合结构图,为了完成借书的过程,在该图中需要设置借阅用户界面类(BorrowUI)、借阅控制类(BorrowCtrl)、借阅信息类(BorrowInfo)、读者类(Reader)和图书类(Book)。
5.1、作用
构件图(Component Diagram)将封装类作为构件,描述在系统实现环境中的软件构件和它们之间的关系。
核心概念
构件、工件、接口(所供接口、所需接口)
装配连接、委托连接、依赖。
推荐场景:系统设计(系统依赖、边界)、实现、部署等
5.2、组成元素
组成元素 |
符号 |
构件(Component) |
|
所供接口(Shallow History) |
|
所需接口(Required Interface) |
|
装配连接(Assembly Connector) |
|
委托连接(Delegate Connector) |
|
依赖(Dependency) |
PS:所供接口和所需接口是 UML 2 中提出的概念,UML 1.x 只有接口的概念,特指所供接口
5.3、示例
(1)图书馆管理系统构件图
UML 1.x 中的构件图
UML 2 中的构件图(新增了所供接口和所需接口图标)
(2)ACI 调度系统构件图
(3)Policy Admin Components Wiring
6.1、作用
部署图(Deployment Diagram)描述系统所需的硬件环境的物理结构,以及软件资源在硬件环境中的部署方案。部署图中的主要概念包括以下几个。
核心概念
节点、工件、部署规范
连接、依赖
推荐场景
系统设计、实施、部署等场合。
6.2、组成元素
组成元素 |
符号 |
节点(Node) |
|
工件(Artifacts) |
|
部署规范(Deployment) |
|
通信路径 (Communication Path) |
|
依赖(Dependency) |
|
部署(Deploy) |
|
承载(Manifestation) |
6.3、示例
(1)图书馆管理系统部署图
从图中可以看到,该系统共有 4 类不同的节点。其中“读者客户端”面向普通读者提供查询、预约等功能;“工作人员前置机”面向工作人员用于实现具体的借书、还书业务;“后台数据库”用于运行系统数据库环境;“管理员后台”用于帮助管理员实现各种系统维护功能。
(2)deployment 物理部署图
7.1、作用
外廓(Profile)是基于 UML 元素的子集为特定领域定义 UML 的一个特定版本,即定义了一组对 UML 已有模型的扩展和限定机制,以用于某个特定领域,自 UML 2.3 起,UML标准新增了外廓图。即如果目前所有的 UML 图如果满足不了业务建模诉求的时候,就可以用外廓图在已有的模型上扩展或减少一些 UML 元模型元素,“创造”出一种新的建模图。
这些扩展和限定机制包括:预定义的构造型、标记值、约束、基类等。
针对一些常用的应用领域,OMG推出了一些标准的扩展,如用于实时嵌入式建模的MARTE(UML Profile for Modeling and Analysis of Real-time and EmbeddedSystems)、用于测试的UML Testing Profile、用于硬件设计的UML Profile for System on a Chip等。
7.2、组成元素
组成元素 |
符号 |
作用 |
构造型 |
定义了针对已存在元模型的扩展,可定义属性 |
|
元类 |
定义了该 profile 中的基本元模型 |
|
外阔 |
定义了一个 profile 包结构,其内部可 以包括构造型、元类等 |
|
扩展 |
构造型到元类之间的关系,表名该构造 型可以针对哪些元类进行扩展 |
|
外廓应用 |
用户模型到外廓包之间的依赖关系,表明用户模型可以应用外廓包中的扩展 |
|
引用 |
外廓包和外部其他包之间的关系,表明该外廓包引用了外部元素 |
7.3、示例
(1)用于数据库建模的外廓图
数据库建模的核心概念是表、字段和关系等,这些概念在 UML 标准规范中并没有定义,无法直接利用 UML 建模。为此,我们需要通过扩展 UML 类图中的相关概念,如可以利用 UML 类建模表,利用类的属性建模表的字段,利用类之间的关联关系来建模实体间的关系。
这里,我们利用外廓图定义了 3 个构造型 MyTable、MyColumn 和 MyRelationship,分别表示数据库表、字段和关系,它们各自从 UML 元类中的类(Class)、属性(Attribute)和关联关系(Association)上扩展而来;此外,对于 MyColumn 构造型,我们还添加了两个布尔类型的标记值PK和IsNULL,分别表示该字段是否为主键(默认值为false)、是否可以为空(默认值为 true)。
需要说明的是,该图采用 Enterprise Architect 绘制,图中 3 个扩展的构造型没有采用组成元素好表的标准表示形式(即名称前面加“<
篇幅有限,下篇会讲到另外7种动态行为图及其设计示例。
最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!