序列图是最常见的一种交互图,它主要关注多条生命线之间的消息交换。
序列图通过关注交换的消息序列及其在生命线上的对应出现规范来描述交互。
以下节点和边线通常绘制在UML序列图中:生命线、执行规范、消息、组合片段、交互使用、状态不变、销毁发生。
序列图的主要元素如下图所示。
生命线
生命线是一个命名的元素,它表示交互中的单个参与者。虽然部分和结构特征可能具有大于1的多重性,但是生命线只代表一个相互作用的实体。
如果引用的可连接元素是多值的(即多重性> 1),那么生命线可以有一个表达式(选择器),该表达式指定该生命线表示哪个特定部分。如果省略选择器,这意味着选择多值可连接元素的任意代表。
生命线是用一个符号来表示的,这个符号由一个矩形组成,矩形构成生命线的“顶部”,后面跟着一条表示参与者生命周期的垂直线(可能是虚线)。
标识生命线的信息以以下格式显示在矩形内(与UML 2.4标准略有不同):
lifeline-ident ::= [ connectable-element-name [ '[' selector ']' ]] [ ':' class-name ] [ decomposition ] | 'self'
selector ::= expression
decomposition ::= 'ref' interaction-ident [ 'strict' ]
其中class-name是表示的可连接元素引用的类型。请注意,虽然语法允许,但lifeline-ident不能为空。
生命线头部的形状基于生命线所代表的部分的分类器。通常头部是一个包含类名的白色矩形。
生命线 “数据”类库存
使用选择器 [k] 选择 X类生命线 “x”
如果名称是关键字self,则生命线代表包含拥有生命线的交互的分类器的对象。 即使包括self,封闭器的端口也可以单独显示。
门
门是一个消息端,连接点,用于将交互片段外部的消息与交互片段内部的消息相关联。
门和门之间的消息的目的是为每条消息指定具体的发送者和接收者。门扮演不同的角色:
正式的门——关于互动
实际的门 - 关于互动的用途
表达门 - 关于组合片段
这些门是隐式或显式命名的。隐式门名称是通过连接消息的方向(“in”或“out”)和消息名称(例如in_search、out_read)来构建的。
门在框架上被标记为消息连接点。
交互片段
交互片段是 表示最通用交互单元的命名元素。每个交互片段在概念上就像是自身的交互。
交互片段没有通用的表示法。它的子类定义了自己的表示法。
交互片段的 示例如下:
事件
事件(完整的UML名称-事件规范,即“事件描述”)是一个交互片段,它代表消息开始或结束时,或者执行开始或结束时的一个时间点(事件)。
事件规范是交互的基本语义单位之一。交互作用的含义由事件规范描述的事件序列来指定。
每个事件规范恰好出现在一条生命线上。生命线的发生规范沿着生命线排序。
事件规范没有符号,只是消息开头或结尾或者执行规范开头或结尾的一个点。
出现的例子有:
消息事件
消息事件(完整的UML名称-消息事件规范)是表示诸如发送和接收信号或调用或接收操作调用等事件的发生。
销毁事件
销毁事件是一个消息事件,表示生命线描述的实例的销毁。它可能导致该对象通过合成拥有的其他对象随后被破坏。在给定生命线的破坏事件下,不会出现其他事件。
事件的完整UML名称是破坏事件规范。在UML 2.4之前,它被称为破坏事件,并且更早停止。
实例的破坏用生命线底部的十字形来描述。
Account lifeline is terminated
执行事件
执行事件(完整的UML名称-执行事件规范)是表示动作或行为开始或结束的时刻的事件。
执行事件仅引用一个描述在此执行事件中开始或完成的执行的执行规范。
执行
执行(全名-执行规范,非正式地称为激活)是交互片段,表示参与者生命周期中的一段时间
- 在生命线内执行一个行为或动作单元,
- 向另一个参与者发送信号,
- 等待来自另一个参与者的回复消息。
注意,执行规范包括行为不是活动的,而是等待回复的情况。一个执行的持续时间由两个执行事件表示——开始事件和结束事件。
执行在生命线上表示为一个灰色或白色的矩形。
Service生命线上显示为灰色矩形的执行规范。
执行规范可以用一个更宽的标签矩形来表示,标签通常标识所执行的操作。
执行规范表示为标记为动作的较宽矩形。
对于涉及原子动作的执行规范,例如读取信号(由消息传送的)的属性,动作符号可以用一行与接收发生规范相关联,以强调整个动作仅与一个发生规范相关联(并且开始和结束关联涉及相同的发生规范)。
同一生命线上重叠的执行规范由重叠的矩形表示。
同一生命线上的重叠执行规范--给自己的消息。
在同一生命线上重叠执行规范 - 回调消息。
状态不变量
状态不变量是一个交互片段,它表示对交互参与者的运行时约束。它可以用来指定不同类型的约束,如属性值或变量值、内部或外部状态等。
该约束在下一个事件规范执行之前立即被评估,使得所有没有被明确建模的动作都已经被执行。如果约束为真,则跟踪是有效跟踪,否则跟踪是无效跟踪。
状态不变量通常显示为生命线上花括号中的约束。
任务的属性t应该等于complete。
它也可以显示为状态符号,表示检查生命线所表示的对象状态的约束的等价物。这可以是相应分类器的分类器行为的内部状态,也可以是基于生命线的“black-box”视图的某个外部状态。
任务应处于完成状态。
状态不变量可以可选地显示为与事件规范相关联的注释。
交互使用
交互使用是允许使用(或调用)另一个交互的交互片段。大型复杂的序列图可以通过交互使用来简化。在其他几个交互之间重用一些交互也很常见。
引用的交互有正式的入口。交互使用提供了一组必须与交互的入口相匹配的实际入口。
交互使用的作用是:
- 将所引用交互的内容复制到需要使用该交互的地方,
- 用参数替换形式参数,
- 将正式的入口与实际的入口连接起来。
- 所使用交互显示为带有运算符引用的组合片段。
网络顾客和书店使用(参考)互动结账。
ref运算符交互使用的语法是:
interaction-use ::= [ attribute-name '=' ] [ collaboration-use '.' ] interaction-name [ io-arguments ] [ ':' return-value ]
io-arguments ::= '(' io-argument [ ',' io-argument ]* ')'
io-argument ::= in-argument | 'out' out-argument
属性名是指交互中将接收交互结果的生命线之一的属性。请注意,这将交互结果限制为仅分配给属性。在现实生活中,方法调用的结果可以从调用方法中分配给变量。
协作使用是绑定协作生命线的协作使用的标识。在这种情况下,交互名称在协作中
IO-arguments是交互的输入和/或输出参数列表。
使用登录交互对用户进行身份验证,并将结果分配回站点控制器的用户属性
由UML规范强加的一个约束有时很难遵循,那就是交互的使用必须覆盖封闭交互上表示的所有相关生命线。这意味着所有这些生命线应该以某种方式相互靠近。如果我们在同一个图上有另一个交互使用,按照UML的要求重新排列所有涉及的生命线可能会非常棘手
|