浅谈UML

1,442 阅读18分钟

本文原创:haorongrong

前言

最近在梳理项目,用到了UML, 对于这个工具可能有的人听过,或者有的人用过但是没有深入了解过。随着项目的需求越来越多,复杂度也越来越高,想要梳理清楚架构思想、项目结构、执行逻辑的话,就需要借助于UML了。我通过参考一些资料,对UML做了如下总结,希望能够对大家有一些用处。

  • UML 介绍
  • UML 使用
  • UML 工具

一、UML介绍

1. UML概念

UML全称Unified Modeling Language,即:统一建模语言,始于1997年一个OMG标准,支持面向对象的分析与设计,为面向对象开发系统的产品进行说明、可视化和编制文档的一种标记语言,贯穿软件开发周期的每一个阶段。

2. UML诞生

在80年代末至90年代中,对面向对象分析与设计方法的研究发展到一个高潮。但是,诸多流派在思想和术语上有很多不同的提法,在术语、概念上的运用也各不相同,需要一种统一的符号来描述面向对象的分析和设计活动。UML应运而生。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且有进一步的发展,最终成为大众所共同接受的标准建模语言。

3. UML特点

  • 统一性,OMG认定的建模语言标准
  • 可视化建模,结构清晰,表示简洁
  • 独立于开发过程,应用到任意一种开发过程中
  • 支持面向对象软件开发
  • 是一种建模语言,而不是一个开发过程

4. UML分类

  • 用例图
  • 静态图(类图、包图、对象图)
  • 行为图(活动图、状态图)
  • 交互图(时序图、协作图)
  • 实现图(部署图、组件图)

5. 适用于软件设计的阶段

  • 【需求分析、可行性研究阶段】用例图
  • 【概要设计】包图、类图、对象图、组件图(架构图)、活动图、状态图
  • 【详细设计】时序图、协作图、状态图、对象图

6. UML意义

  • 架构师、项目经理:指导开发,分配任务,分析系统
  • 开发人员:理解设计,开发沟通等
  • 测试人员:组织测试,编写用例等

二、UML使用

1. 用例图

1.1 概念

用例图是需求分析的产物,描述了系统的参与者与系统进行交互的功能,是参与者所能观察和使用到的系统功能的模型图。它的主要目的就是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的“角色”关系以及系统各个功能之间的关系。

1.2 组成

  • 【参与者】:表示与您的应用程序或系统进行交互的用户、组织或外部系统。用一个小人表示。
  • 【用例】:外部可见的系统功能,对系统提供的服务进行描述。 用椭圆表示,描述文字在椭圆里或外都可以
  • 【子系统】:用来展示系统的一部分功能,这部分功能联系紧密。

1.3 关系

  • 【关联】:表示参与者与用例之间的通信,任何一方都可发送或接受消息。箭头指向:指向消息接收方
  • 【泛化】:就是通常理解的继承关系,子用例和父用例相似,但表现出更特别的行为;子用例将继承父用例的所有结构、行为和关系。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的。箭头指向:指向父用例
  • 【包含】:包含关系用来把一个较复杂用例所表示的功能分解成较小的步骤;箭头指向:指向分解出来的功能用例
  • 【扩展】:扩展关系是指 用例功能的延伸,相当于为基础用例提供一个附加功能。箭头指向:指向基础用例

1.4 案例

yongli.png

2. 包图

2.1 概念

当对一个比较复杂的软件系统进行建模时,会有大量的类、接口、组件、节点和图需要处理;如果放在同一个地方的话,信息量非常的大,显得很乱,不方便查询,所以就对这些信息进行分组,将语义或者功能相同的放在同一个包中,这样就便于理解和处理整个模型。而包图就是描述包与包之间的关系的UML图。

2.2 组成

类、接口、构件、节点、协作、用例、图和子包。

注意:一个元素只能属于一个包。每一个包就是一个独立的命名空间,两个不同的包之中可以有相同的元素名,只是所处的包不同,其全名不同。

2.3 可见性

+ : public 公共元素对所有引入的包以及他们的后代都可见
# : protected 只对那些与包含这些元素的包有泛化(继承)关系的包可见
- : private 对包外元素完全不可见

2.4 关系

  • 【依赖】:两个包存在依赖关系通常是指这两个包所含的模型元素之间存在着一个或多个依赖。对于由对象类组成的包,如果两个包中的任意两个类之间存在依赖关系,则这两个包之间存在依赖关系。包的依赖是不传递的。箭头指向:虚线箭头指向被使用者
依赖又细分为以下4种:
1.《use》客户包依赖于提供者包,默认依赖关系
2.《import》客户包中的元素能够访问提供者包中的所有元素
3.《access》只想使用提供者包中的元素,而不想将其命名空间合并
4.《trace》表示一个包到另一个包的历史发展
  • 【泛化】特殊包必须遵循一般包的接口。对于一般性包可以标明 {abstract},定义为一个接口,该接口有多个特殊包实现。特殊包从一般包继承其所含的公共类,并且可以重载和添加自己的类。特殊包可以替代一般包,用在一般包使用的任何地方。箭头指向:实线空心箭头,箭头指向父用例

2.5 案例

baotu.png

3. 类图

3.1 概念

类图(Class Diagram): 类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。

3.2 组成

  • 类名、属性、方法

3.3 类的作用域

  • “+” 号表示public
  • “#” 号表示protected
  • “-” 号表示private

3.3 关系

  • 【泛化】:即继承关系,子用例和父用例相似,但表现出更特别的行为;子用例将继承父用例的所有结构、行为和关系。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的。箭头指向:实线空心箭头,箭头指向父用例
  • 【实现】:实现是一种类与接口的关系,表示类是接口所有特征和行为的实现,在程序中一般通过类实现接口来描述。箭头指向:虚线空心箭头,箭头指向接口
  • 【依赖】:使用的关系,一个类需要另一个类的协助,比如局部变量、方法参数、静态方法调用。箭头指向:虚线箭头指向被使用者
  • 【关联】:拥有的关系,表示类与类之间的联接,它使一个类知道另一个类的属性和方法,双向关联可以有两个箭头或没有箭头,单向关联有一个箭头。自关联,箭头指向自己。java中一个类的全局变量引用了另一个类,就表示关联了这个类。箭头指向:实线箭头指向被拥有者,关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
  • 【聚合】:整体与部分的关系,且部分可以离开整体而单独存在。是一种关联关系,且是强关联关系。箭头指向:实线箭头指向被拥有者
  • 【组合】:整体与部分的关系,但部分不能离开整体而存在。是一种关联关系,组合关系是比聚合关系还要强的关联关系。箭头指向:实线箭头指向被拥有者

3.4 案例

leitu.png

4. 对象图

4.1 概念

描述的是参与交互的各个对象在交互过程中某一时刻的状态。对象图可以看做是类图在某一时刻的实例。

4.2 元素 & 关系

对象图使用的符号和关系是和类图都是相同的,因为对象图就是类的实例。由于对象图存在生命周期,所以对象图只能在系统的某一个时间段内存在。 因为在UML中,类图描述的是系统的静态结构和关系,交互图描述的是系统的动态特性。而在跟踪系统交互过程中,会涉及某一瞬间交互对象的状态,而这个状态类图与交互图都没有对此进行描述,所以才会出现对象图来对此状态进行描述。

4.2 类图与对象图对比

duibi_1.png

5. 状态图

5.1 概念

用来描述一个特定的对象所有可能的状态,以及由于各种事件的发生而引起的状态之间的转移和变化。用于研究类、角色、子系统、或组件的复杂行为。

注:并不是所有的类都需要画状态图,有明确意义的状态,在不同状态下行为有所不同的类才需要画状态图。

5.2 元素

  • 【状态】:状态用圆角矩形表示,内部加文字有名状态,内部空白匿名状态
    • 初态: 用实心圆点表示
    • 终态: 用圆形内嵌圆点表示
  • 【转移】:是两个状态之间的一种关系,表示对象将在源状态中执行一定的动作,并在某个特定事件发生而且某个特定的警界条件满足时进入目标状态
  • 【动作】: 是一个可执行的原子操作,也就是说动作是不可中断的,其执行时间是可忽略不计的。
  • 【自身转移】:即状态返回自身状态的转移
  • 【组合状态】:嵌套在另外一个状态中的状态称之为子状态(sub-state),一个含有子状态的状态被称作组合状态
  • 【入口点】:由于一些原因并不会执行初始化,跳过初态而直接通过一个节点进入某一状态,则此节点称之为入口点
  • 【出口点】:同理,有入口点,当然也有出口点
  • 【历史状态】:历史状态是一个伪状态(Pseudostate),其目的是记住从组合状态中退出时所处的子状态,当再次进入组合状态,可直接进入这个子状态,而不是再次从组合状态的初态开始。一个圆圈内部加字母H表示。
  • 【并发区域】: 说明组合状态在某一时刻可以同时达到多个子状态

5.3 案例

zhuangtai.png

6. 活动图

6.1 概念

活动图本质上是一种流程图,它描述活动的序列,即系统从一个活动到另一个活动的控制流. 用来描述用例,描述类的操作,另外,可以用来描述算法(单独使用)。

6.2 组成

  • 活动:表示工作流过程中命令的执行或活动的进行,活动符号:
  • 状态: 一个活动图中只能有一个开始状态,但可以有多个结束状态
  • 转移:活动之间、活动与状态之间的转换。

6.3 案例

huodong.png

7. 时序图

7.1 概念

时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。

7.2 元素

  • 【角色】:可以是人或者其他系统,子系统。以一个小人图标表示。
  • 【对象】:位于时序图的顶部,位于时序图顶部表示在交互开始就存在了,否则,在交互过程中创建的。以一个矩形表示。
对象的命名方式一般有三种:
1.对象名和类名
2.只显示类名,不显示对象,即为一个匿名类。
3.只显示对象名,不显示类名
  • 【生命线】:每个对象和底部中心都有一条垂直的虚线,这就是对象的生命线(对象的时间线)。以一条垂直的虚线表。

  • 【控制焦点】:代表时序图中在对象时间线上某段时期执行的操作。以一个很窄的矩形表示。

  • 【消息】:表现对象之间交互通信。

    • 同步消息:消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义。以一条实线+实心箭头表示。
    • 异步消息:消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。以一条实线+大于号表示。
    • 返回消息:返回消息表示从过程调用返回。以小于号+虚线表示
  • 【自关联消息】:表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。以一个半闭合的长方形+下方实心剪头表示。

  • 【组合片段】:用来解决交互执行的条件和方式,它允许在序列图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。组合片段共有13种,名称及含义如下:

(1)ref(引用):引用其他地方定义的组合片段;
(2)alt(抉择):包含一个片段列表,这些片段包含备选消息序列。在任何场合下只发生一个序列;
(3)opt(选项):包含一个可能发生或者可能不发生的序列,可以在临界中制定序列发生的条件。
(4)break(中断):如果执行此片段,则放弃序列的其余部分,可以使用临界来指示发生中断的条件。
(5)par(并行):并行处理,片段中的事件可以交错
(6)seq(弱顺序):有两个或更多操作片段,涉及统一生命线的消息必须以片段的顺序发生,如果消息涉及的生命线不同,来自不同片段的消息可能会并行交错。
(7)strict(强顺序):有两个或更多操作数片段,这些片段必须给定顺序发生。
(8)neg(否定):此片段中显示的序列不得发生。通常在Consider或Ignore片段中。
(9)region:标志在组合片段中先于其他交互片断发生的交互;
(10)ignore:明确定义了交互片段不应该响应的消息;
(11)consider(考虑):指定此片段描述的消息列表,其他消息可发生在运行的系统中,但对此描述来说意义不大。
(12)assert(断言):操作数片段指定唯一有效的序列。通常在Consider或Ignore片段中。
(13)loop(循环):此片段重复一定次数。可以在临界中指示片段重读的条件。Loop组合片段具有‘Min’和‘Max’属性,他们指示片段可以重复的最小和最大次数。默认值是无限制。

7.3 案例

shixutu.png

8. 协作图

8.1 概念

协作图也叫合作图、通信图, 是一种交互图。一个协作图显示了一系列的对象和在这些对象之间的联系以及对象间发送和接收的消息。协作图作为表示对象间相关作用的图形表示,也可以有层次结构。可以把多个对象作为一个抽象对象,通过分解,用下层协作图表示出这多个对象间的协作关系,这样可缓解问题的复杂度。

8.2 组成元素

  • 【活动者】用小人儿表示
  • 【对象】用长方形框表示对象。
  • 【连接】使用实线标记两个对象之间的连接。
  • 【消息】由标记在连接上方的带有标记的箭头表示。有向边的箭头方向表示传递消息的方向,在有向边上方标识出是什么消息,为表示发送消息的时间顺序,在每个消息前附加数字编号
显然,协作图便于描述对象间有什么样的协作关系,不需要像一个序列图只能对应于一个场景一样,可以将多个场景中的协作关系一次性地全部描述出来,不过,与序列图一样,在UML的协作图中,也规定了消息发送条件的描述。

8.3 协作图与序列图对比

协作图和序列图都可以表示对象之间的交互和通信,但侧重点不同:

1.协作图强调上下文相关,不强调顺序,可以表示实现某个操作或达到某种结果而在对象间交换的一组消息,如果需要强调时间和序列,最好选择序列图。

2,协作图特别适合用来描述少量对象之间的简单交互,随着对象和消息数量的增多,理解协作图将越来越困难,此外,协作图很难显示补充的说明性信息,例如时间、判定点或其他非结构化的信息,而在序列图中这些信息可以方便地添加到注释中。

8.4 案例

xiezuo.png

9. 部署图

9.1 概念

部署图又叫(配置图),表示一组物理结点的集合及结点间的相互关系,它可以描述系统的架构,既可以用于描述规范级别的架构,也可以描述实例级别的架构。部署图的使用者是开发人员、系统集成人员和测试人员。

9.2 元素

  • 【结点】:结点是存在与运行时的代表计算机资源的物理元素,可以是硬件也可以是运行其上的软件系统,比如64主机、Windows server 2008操作系统、防火墙等。结点用三维盒装表示。
  • 【结点实例】:结点实例的命名格式:Node Instance : node。它与结点的区别在于名称有下划线和结点类型前面有冒号,冒号前面可以有示例名称也可以没有示例名称 。
  • 【结点类型】:结点类型有:cdrom、cd-rom、computer、disk array、pc、pc client、pc server、secure、server、storage、unix server、user pc,并在结点的右上角用不同的图标表示。
  • 【物件】:物件是软件开发过程中的产物,包括过程模型(比如用例图、设计图等等)、源代码、可执行程序、设计文档、测试报告、需求原型、用户手册等等。物件用带有关键字 artifact 和文档图标表示。
  • 【连接】:结点之间的连线表示系统之间进行交互的通信路径,这个通信路径称为连接(Association)。
  • 【结点容器】:一个结点可以包括其他的结点,比如组件或者物件,则称此结点为结点容器。

9.3 案例

bushu.png

10. 组件图

10.1 概念

组件图即是用来描述组件与组件之间关系的一种UML图。组件图在宏观层面上显示了构成系统某一个特定方面的实现结构。

10.2 元素

  • 【组件】:组件是一个封装完好的物理实现单元,它具有自己的身份标示和定义明确的接口。并且由于它对接口的实现过程与外部元素独立,所以组件具有可替换性。长方形+小模块图标+组件名称
  • 【接口】:对于一个组件而言,它有两类接口,提供接口与需求接口。
(1)提供接口:又被称为导出接口或供给接口,是组件为其他组件提供服务的操作的集合。实线+圆圈表示。
(2)需求接口:又被称为引入接口,是组件向其他组件请求相应服务时要遵循的接口。实线+半圆表示。
  • 【关系】:分为依赖关系和实现关系
(1)依赖关系
    a.组件与需求接口之间建立依赖关系
    b.组件与组件之间建立依赖关系:说明在运行过程中A在某些行为上依靠组件B的支持
(2)实现关系
组件与提供接口之间建立实现关系

10.3 部署图与组件图关系

部署图与组件图密切相关,部署图是用来描述软件组件部署的硬件组件;而组件图是用来描述组件和显示了它们是如何在硬件中部署。

10.4 案例

zujian.png

三、UML工具

  • StarUML:开源的,灵活,需安装
  • PlantUML:Java类库,可通过IDE插件安装
  • ProcessOn:模版多,免费,在线的无需安装

结束语

了解完了UML还需要在平时的工作种多使用多练习才可熟能生巧,这个阶段可能会花费较长的时间。但我想说:软件设计的灵魂是想法,UML是表达我们想法的工具,没有想法,UML将无用武之地。

参考

blog.csdn.net/mccand1234/… www.cnblogs.com/pangjianxin… cloud.tencent.com/developer/a… blog.csdn.net/TGBTrial/ar… blog.csdn.net/aswallow032… www.cnblogs.com/jingwhale/p… www.jianshu.com/p/dcba5baba… www.cnblogs.com/jing99/p/10… blog.csdn.net/scythe666/a… www.cnblogs.com/gd-luojiali… www.w3cschool.cn/uml_tutoria…