UML _ 顺序图
前置知识
交互图定义
交互图(Interaction Diagram)是一组模型图的统称,是用来描述对象之间的关系和对象之间的信息传递的图。
通常用来描述一个用例的行为,实现一个用例或用例的一部分,从而完成对系统的动态行为建模。
交互图类型
- Sequence Diagram 顺序图
- Communication Diagram 通信图 (UML1中的协作图Collaboration Diagram)
- Timing Diagram 定时图
- Interaction Overview Diagram 交互概述图
用例图是一种动态图,可以描述整个系统的功能需求(系统中有哪些参与者、包括哪些功能、参与者可以使用哪些用例);
类图是一种静态图,可以描述整个系统的功能是由哪些类来完成的。
概述
顺序图(Sequence Diagram)是用于描述一组对象及其协作过程的模型图,也称序列图。
顺序图展示了对象之间如何相互协作来完成某一项功能,强调各个对象按照时间顺序进行交互的过程。
注意:.
- 顺序图是一种动态图
- 顺序图是一种交互图
组成
顺序图主要由 对象 ,生命线 ,激活 , 消息 组成。
对象之间通过传递消息的方式来发生交互。
注意:交互是一种行为事物,不是关系。
表示
在UML的表示中,顺序图将交互关系表示为一个二维图。其中,纵向是时间轴,时间沿竖线向下延伸。横向代表了交互中的一组对象(对象角色),对象间的顺序并不重要。
例:
图书借阅系统——查找图书顺序图
顺序图的作用
-
细化用例的表达。(最常用)
使用顺序图的主要用途,就是将用例所表达的需求与功能转化为更加正式、更加分明的细化表达。
用例常常被细化为一个或更多的顺序图。 -
有效地描述如何分配各个类的职责。
可以根据顺序图中各对象之间的交互关系和发送的消息来进一步明确对象所属类的职责。
例如,Borrower对象向SearchBookWindow对象请求查找图书,指出SearchBookWindow对象应该具有“查找图书”这个职责。
- 丰富系统的使用情境的逻辑表达。
系统的使用情境即为系统可能的使用方式和使用环境,也就是代表用例的一次具体使用
(如:张三xxxxx,李四xxxxxx)
一个使用情境的逻辑,可能是一个用例的一部分,或是一条控制流。
基本组成
组成
顺序图主要由以下元素组成:
- 对象
- 生命线
- 激活
- 消息
对象之间通过传递消息的方式来发生交互。
对象
顺序图中的对象(Object),可以是系统参与者或任何有效的系统对象。
分类
- 对象置于顺序图的顶部,意味着交互开始时对象就已经存在了。
- 对象不置于顶部,意味着对象是在交互过程中创建的。
表示:名字下面 加下划线
因为顺序图不可能出现类,因此在顺序图可以不加下划线
三种命名形式:
- 标准:
类名:对象
- 匿名:只显示类名(最常用)
- 省略:只显示对象名(一般不用)
注意:顺序图中可以使用 参与者<<user>>
和 分析类的对象。
- 对象从左到右依次排列(一般是按参与者、边界对象、控制对象、实体对象的顺序)
- 对象不能是系统,对象名字不要出现“系统”
分析类
- 边界类
系统界面,负责输入信息或展示输出。- 控制类
负责对界面输入的数据进行计算。
如果计算结果需要保存,则传递给实体类。
如果计算结果需要输出,则传递给边界类。- 实体类
负责存储计算的结果。
生命线(Lifeline)
是一条垂直的虚线,用于表示顺序图中的对象在一段时间内的存在。
对象与生命线结合在一起称为对象的生命线。
注意:
生命线不能单独存在,必须和对象一起存在,对象创建之后,生命线即开始。
。
表示:
一条竖直的虚线
如果对象生命周期结束,只需要在结束时间的生命线上打叉号即可。
控制焦点/激活(Activation)
激活也称为控制焦点Focus of Control,UML2中改称为执行规约ExecutionSpecification。
是对象操作的执行,表明对象正在进行交互(正在完成某个任务或正被占用)。它表示一个对象直接或通过从属操作完成操作的过程。
表示:
激活在顺序图中用一个细长的矩形框表示,它的顶端与激活时间对齐,而底端与完成时间对齐。
一个被激活的对象要么执行自己的代码,要么等待另一个对象的返回结果。
对象在完成自己的工作后,被去激活,对象就处于空闲状态。
消息(Message)
是从一个对象(发送者)向另一个或几个其他对象 (接收者)发送信号,或由一个对象(发送者或调用者)调用另一个对象 (接收者) 的操作。
生命线之间带箭头的线段代表对象间的消息传递。
消息涉及以下三个概念:
发送者:发出消息的类元角色。
接收者:接收到消息的类元角色。
活动:消息传递时产生的局部操作或原始动作(创建、销毁)等。
组成:
消息主要包括编号、名称、类型等组成部分。
表示
类型由不同形式的带箭头的线段表示,线段上方标注“编号:名称
”格式的消息文本。
注意:
- 顺序图中消息编号可不显示。(一般都显示)
- 通常,一个顺序图的消息流开始于左上方,消息按照先后顺序从上到下排列。消息2的位置比消息1低,这意味着消息2的顺序比消息1要迟。
编号
顺序图中消息的编号,可以采用两种形式:
- 顺序编号(常用)
- 嵌套编号
顺序编号
按照消息的先后顺序:
从1开始对消息编号,后边依次是2、3、4……。
嵌套编号
嵌套编号表示了操作间的包含关系,分层次编号,把属于同一个对象发送和接收的消息放在同一层进行编号。
注意
- 顺序图中消息编号可不显示。(一般都显示)
U免费版中,可以通过菜单Tools→Options命令,在打开对话框的Diagram选项卡中,设置是否选择Show Sequence number复选框。
SU商业版中,可以通过图的属性窗口设置是否选择showSequenceNumber复选框。
名称
消息的名称,可以简单,也可以复杂。
最简单的消息只有一个简单消息名,例如“查找图书”。
而复杂消息传递的信息比较多,消息名称通常具有如下语法格式:
$$[守卫条件][序列表达式][返回值:=]消息名 [(参数列表) ]$$
守卫条件(guard-condition)
-
作用: 只有消息满足守卫消息时,消息才可能执行。(类似代码中的if)
-
形式: [ 条件短语 ] (中括号不可省略)
条件短语通常用伪代码或程序语言来表示,UML并不规定其语法。 -
例如,2: [x<0] invert(x, y)
序列表达式(sequence-expression)
作用: 表示一个循环或选择的执行。
两种形式:
- \(* [ 循环子句 ]\) :重复执行。(类似代码中的for)
(中括号不可省略) - \([ 条件子句 ]\) :选择某个分支执行 。(类似代码中的if,else的双/多分支)
(中括号不可省略)
例如:
3: *[ x = 1..10] Update()
4: [if Id not exists] Create(Id)
常见序列表达式
调用操作(返回值 ,参数列表)
形式:[返回值:=]消息名 [(参数列表) ]
消息经常是调用对象的某个操作,而操作可能具有参数和返回值,
例如:
6: display() ——无参数、无返回值
7: p:=find(s) ——带参数和返回值
类型
顺序图的消息可以分为多种类型,由不同形式的带箭头的线段表示。
最常用的消息类型:
简单消息,调用消息,返回消息。
不同的建模工具,支持的消息类型有所不同。
SU免费版支持以下五种,商业版支持六种,多了异步消息
- 调用消息
- 简单消息(发送消息)
- 返回消息
- 创建消息
- 销毁消息
Rose支持的七种消息:
上面时消息名称,下面是消息的表示
简单消息
简单消息表示控制流,可以泛指任何交互。
一般在不关心消息类型或不确定消息类型时使用。
在顺序图建模初期,可以先用简单消息表示所有消息,后期再根据情况确定消息的类型。
调用消息和返回消息
调用消息
调用消息表示发送者调用某个对象的一个操作。
通常格式为“对象名.操作名”。
分类
- 可以是对象之间的调用,
- 可以是对象本身的调用(自调用)。
返回消息
返回消息表示接收者向发送者返回一个值。
注意
- 如果是从操作调用返回,则返回消息可以是隐含的;
- 对于非操作调用,如果有返回消息,则必须画出来。
同步消息和异步消息
同步消息
同步消息的发送者通过消息把信号传递给接收者后,必须等到接收者返回消息,才能继续后续活动。
异步消息
异步消息的发送者通过消息把信号传递给接收者后,就继续自己的活动,不等待接收者返回消息。
阻止消息和超时消息
阻止消息
阻止消息指发送者发出消息给接收者,如果接收者无法立即接收这个消息,则发送者放弃这个消息。
超时消息
超时消息指发送者发出消息给接收者,并按指定时间等待,若接收者无法在指定时间内接收这个消息,则发送者放弃这个消息。
高级概念
主要是以下四点:
- 对象的创建与销毁(掌握)
- 消息的分支与循环(掌握)
- 消息延迟(不要求)
- 从属流(不要求)
对象的创建与销毁
创建对象
是指发送者通过发送消息的方式实例化对象。
实现方式
- 通过调用构造函数来实现,
- 通过发送一条具有
<<create>>
构造型的消息来表示。
销毁对象
销毁对象是指发送者通过发送消息的方式将对象销毁,并回收其拥有的资源。
销毁对象表示对象生命线的结束,在对象生命线中使用一个“×”来进行标识。
实现方式
- 调用析构函数来实现
- 发送一条具有
<<destroy>>
构造型的消息来表示。
注意:
- 需要销毁的对象一般都是对话框。
- 允许对象销毁自身
消息的分支与循环
注意:
Rose对顺序图的分支没有明显的支持,一般只要画出主要分支的过程即可。
StarUML和Visual Paradigm支持顺序图的分支。
分支
分支是指从同一点发出的多条消息指向不同的对象。
分类:
根据消息是否互斥,分支分为两种结构: 条件和并行
-
条件: 根据不同的条件,进入不同的处理流程中,实际上只发送一条消息给某个对象。
-
并行: 当执行到某一点时,同时向两个或两个以上对象发送消息,消息是并行发送的。
注意:
Rose对循环没有明显的支持,一般通过在第一条消息前添加标签来描述多条消息的循环过程。
Visual Paradigm、StarUML通过片段符号来支持多条消息的循环。关于片段,以后再做介绍。
循环
循环用于强调需要重复执行一条消息或多条消息,有多种表示方式。
分类及实现
- 单条消息循环
在需要循环执行的消息前添加*
,并在其后的中括号中写明循环条件。
用户打印多个文件
- 多条消息循环
利用片段实现
依次打印队列中的文件
消息延迟
消息延迟是指从一个对象到另一个对象的消息传递不是瞬间完成的,消息的传送需要一定的时间。
消息延迟这种情况经常发生在两个应用程序通过网络相互通信时。
例如,
用户收取Email邮件:由于邮件服务器是外部对象,用户与邮件服务器的相互通信需要一定的网络延迟。
表示:
通常,消息箭头是水平的,说明传递消息的时间很短,在此期间不会发生其他事件。
如果消息延迟,在此期间可能出现其他事件,则消息箭头可以画为向下倾斜的。
Rose和SU不支持消息延迟, VP通过“期间消息”支持。
从属流
从属流是指从同一点发出多个消息,指向同一对象的不同生命线,即可以创建对象的生命线分支。
Rose和SU不支持从属流, VP支持。
高级组成
框架:实现顺序图的重用(不要求)
片段:加强顺序图的结构化控制(掌握)
片段更常用
框架(Frame)
Rose不支持框架,Visual Paradigm和StarUML支持。
在UML 2中,增加了“框架”符号,对UML图形进行扩充。
框架(Frame),也称为帧,借助于框架,可以将顺序图进行帧化。
用途
帧化类型比较常见的是顺序图和通信图。
框架的作用:
-
顺序图一旦被包含在一个框架中,就可以被放在另外的框架或图中,从而实现顺序图的重用。
-
框架经常用于分解大型的顺序图,之后在总图中引用各个部分。
-
帧化的方法使用户能够在一个顺序图中快速方便地重用另一个顺序图的内容。
表示:
帧化顺序图: 把顺序图用一个矩形框包围起来,并在矩形的左上角添加一个五边形的间隔区。
小五边形的间隔区包含了用于识别该顺序图的信息;
信息采用“图类型 交互名称”的格式进行声明;例如:sd Login。
例子:
交互事件
把带有标记的框架(帧)插入到一个新图中,就可以实现重用,这个特定的帧化的部分叫做交互事件。
交互事件是交互片断的一种特殊情况,它的操作符是ref。
例子:
(交互)片段
Rose不支持片段,Visual Paradigm和StarUML支持。
在UML 1中,顺序图十分不擅长表示循环和分支。
UML 2提供了“片段” 机制,加强顺序图的结构化控制,使得顺序图可以表达更加复杂的交互。
片段,全称交互片断(Interaction Fragment)
是UML 2中对一个顺序图的某一段的一般称呼。
用于表示比较复杂的交互。
表示
-
片段表示为顺序图中的一个矩形框,
-
左上角有一个写在小五边形内的标签,来表明控制操作符的类型。
控制操作符表示了不同的片段类型。
每个片段都有一个操作符,操作符决定了交互片段的执行方式。
标签内可以写名字 -
一个片段可以包含多个区域,区域间用区域分割符分割,每个区域拥有一个监护条件和复合语句。
片段中可以包含任意数目的交互,还可以包含嵌套片段。
常见片段类型
片段类型 | 参数 | 作用 |
---|---|---|
ref | 无 | Reference,引用:引用其他交互图,经常用于分解大型的顺序图(类似于用例关系中的include) |
loop | 有 | 循环(迭代):循环执行该片段内的交互,直到判断条件为假;这类似于程序设计语言中的for或while循环语句 |
break | 无 | 中断:当包含在break片段中的交互发生时,则退出任何一个交互;这类似于程序设计语言中的break语句。 |
alt | 有 | Alternatives,选择:表示一种多条件分支,根据判断条件,最多选择片段中的一个交互执行;类似于程序设计语言中的if…else或switch语句。 |
opt | 有 | Option,可选:表示一种单条件分支,包含在此片段中的交互只有在判断条件为真时才执行 |
par | 无 | Parallel,并行:片段中的各个交互并行执行。 |
除了常用的ref、loop、break、alt、opt、par,还有assert、consider、ignore、seq、strict、neg、critical(或region)等不太常用的类型。
引用片段ref
ref 操作符用来在一个交互图中,引用其他的交互图。
在片段的区域中,写明被引用的交互图名称。
循环片段loop
loop操作符说明该片段将执行多次,而具体的次数由置于方括号内的循环次数和监护条件表达式来说明。
例如:
loop(i<=10):表示while(i<=10)
loop(10) :表示执行10次
loop(1,n):表示for(i=1; i<=n; i++)
表示
中断片段break
break操作符定义一个含有监护条件的子片段。
- 若监护条件为“真”则执行子片段,不执行子片段后面的其他交互;
- 若监护条件为“假”,就跳过子片段,按正常流程继续执行其他交互。
这类似于程序设计语言中的break语句。
表示
例子:
选择片段alt
alt操作符表示一种多条件分支,根据监护条件,最多选择片段中的一个交互执行;
类似于程序设计语言中的if…else或switch语句。
表示
需要为每个分支建立交互区域:
将控制操作符的主体使用分隔线分割为几个区域,每个区域要给出监护条件。
当监护条件为真时,该区域的交互会被执行。
可选片段opt
opt操作符表示一种单条件分支,包含在此片段中的交互只有在监护条件为真时才执行。
类似于程序设计语言中的if(无else)语句。
并行片段par
par操作符表示片段中的各个交互并行执行。
需要为每个分支建立交互区域,每个区域无需监护条件。