UML序列图 构成元素

序列图包括对象、生命线、消息和激活4个构成元素,其中对象是系统的参与者或者任何有效的系统对象,生命线是一个时间线,而消息是用来说明序列图中对象之间的通信。在本小节中,将详细介绍序列图的构成元素。

UML序列图 – 对象

类定义了对象可以执行的各种行为。但是,在面向对象的系统中,行为的执行者是对象,而不是类,因此序列图通常描述的是对象层次,而不是类层次。

对象的定义

对象可以是系统的参与者或者任何有效的系统对象。序列图中的每个对象显示在单独的列中,对象标识符为带有对象名称的矩形框。

对象在列中的位置表示了对象的存在方式。

  • 若对象放置在消息箭头的末端,其垂直位置显示了这个对象第一次生成的时间,表示对象是在交互过程中,由其他对象创建。

  • 若对象标记符放置在序列图的顶部,表示对象在序列图的第一个操作之前就存在。

序列图中对象的标记符如下图所示。

UML序列图

对象有以下3种命名方式。

  • 第一种方式包括类名和对象名,表示为对象名+冒号+类名。

  • 第二种方式只显示对象名。

  • 第三种方式只显示类名,表示该类的任何对象,表示为冒号+类名。

一个对象实际上可以代表一组对象,是某个应用、子系统或同类型对象的集合。例如,本节第1个图中的购物系统,代表了搜索、选货、发货等,是主系统;而商品信息系统只提供信息资源的显示,相当于数据库。

对象的创建和撤销

对象的创建有几种情况,在前面讲述对象生命线时曾经说过,对象可以放置在序列图的顶部,如果对象在这个位置上,那么说明在发送消息时,该对象就已经存在;如果对象是在执行的过程中被创建的,那么它应该处在图的中间部分。

创建这种对象标记符,如下图中的示例所示。创建一个对象的主要步骤是发送一个create消息到该对象。对象被创建后就会有生命线,这与序列图中的任何其他对象一样。创建一个对象后,就可以像序列图中的其他对象那样来发送和接收消息。

UML序列图

对象可以被创建和删除,删除对象需要发送destroy消息到被删除对象。要想说明某个对象被销毁,需要在被销毁对象的生命线最下端放置一个”×”字符。

有许多种原因需要在序列图的控制流中创建和撤销对象。例如,经常用来提醒或提示用户的消息框。在用户操作有误或操作已完成时,需要创建一个对象向用户显示提示消息框,之后由用户确认并销毁该消息框。如上图所示,当用户登录失败后,将创建一个错误提示对象,以提示用户登录错误。

对象的创建和撤销同样用于提示用户操作完成或注册成功等,通常由用户确认关闭,在关闭的同时删除了提示对象。

UML序列图 – 生命线

对象在垂直方向向下拖出的长虚线称为生命线,生命线是一个时间线,从序列图的顶部一直延续到底部,所用的时间取决于交互的持续长度。生命线表现了对象存在的时段。

生命线的休眠状态和激活状态如下:

  • 休眠状态下生命线由一条虚线表示,代表对象在该时间段是没有信息交互的。
  • 激活状态就是激活期,用条形小矩形表示,代表对象在该时间段内有信息交互,交互由消息表示。

UML序列图 – 消息

在任何一个软件系统中,对象都不是孤立存在的,它们之间通过消息进行通信。为了显示一个对象传递一些信息或命令给另外一个对象,使用一条线从对象指向接收信息或命令的对象。这条线可以有自己的名称,用来描述两个对象之间具体的交互内容。既联系了两个对象,又描述了它们间的交互,这就是消息的作用。

什么是消息

消息是用来说明序列图中对象之间的通信,可以激发操作、创建或撤销对象。为了提高可读性,序列图的第一个消息总是从顶端开始,并且一般位于图的左边,然后将继发的消息加入图中,稍微比前面的消息低些。

在序列图中,消息是由从一个对象的生命线指向另一个对象的生命线的直线箭头来表示,UML中有4种类型的消息:同步消息、异步消息、简单消息和返回消息,分别用4种箭头符号表示,如下图所示。箭头上面可以标明要发送的消息名。

UML序列图

简单消息是不区分同步和异步的消息,它可以代表同步消息或异步消息。有时消息并不用分得很清楚,是同步还是异步,或者有时不确定是同步还是异步,此时使用简单消息代替同步消息和异步消息既能表达意思,又能很好地被接受。

在对系统建模时,可以用简单消息表示所有的消息,然后再根据情况确定消息的类型。

当有消息产生,对象就处于激活状态,因此消息的箭头总是由生命线上的小矩形出发,在另一个对象(或自身)生命线的小矩形结束。
在各对象间,消息发送的次序由它们在垂直轴上的相对位置决定。如下图所示,发送消息2:“返回查询信息”的时间是在发送消息1:“查询”之后。

UML序列图

在序列图中也可以使用参与者。实际上,在建模序列图时将参与者作为对象可以说明参与者是如何与系统进行交互的,以及系统如何响应用户的请求。参与者可以调用对象,对象也可以通知参与者。

如下图所示为网购的一部分,顾客与系统交互才有了商品的最终确定。

UML序列图

阅读一个序列图需要沿着时间线传递消息流,通常从最顶层的消息开始。本示例中是从消息1开始的。

  • 参与者将查询条件发送到网购管理系统。
  • 网购管理系统在接收到查询条件后,将查询条件发送到商品信息对象。
  • 商品信息对象接收到查询条件后,将返回一个查询结果到网购管理系统。系统对接收的返回结果进行处理,展示给顾客。
  • 顾客选定商品。

上面的示例图说明了参与者同对象一样可以将消息发送给序列图中的任何参与者或者对象。

当建模序列图时,对象可以将消息发送给它自身,这就是反身消息。例如,在下图登录系统中,验证消息就是反身消息。在反身消息里,消息的发送方和接收方是同一个对象。系统对象发送验证消息给它自身,使该对象完成对用户身份的验证。

UML序列图

如果一条消息只能作为反身消息,那么说明该操作只能由对象自身的行为触发。这表明该操作可以被设置为Private属性,只有属于同一个类的对象才能调用它。在这种情况下,应该对序列图进行彻底的检查,以确定该操作不需要被其他对象直接调用。

消息从发送者和接收者的角度可以分为以下4种类型。

  • Complete 消息的发送者和接收者都有完整描述,这是一般的情形。
  • Lost 有完整发送者发送消息,但未描述接收事件,如消息没有达到目的。此时在消息的箭头处使用实心圆注释,如下图所示。

UML序列图

  • Found 有完整的接收事件,但未描述发送事件,如消息的来源在描述的范围之外。此时在消息的开始端用实心圆注释,如下图所示。

UML序列图

  • Unknown 发送者和接收者都不确定,这是错误情形。

同步消息

同步消息假设有一个返回消息,在发送消息的对象进行另一个活动之前需要等待返回的响应消息。消息被平行地置于对象的生命线之间,水平的放置方式说明消息的传递是瞬时的,即消息在发出之后会马上被收到。

如下图所示,用户网购商品时先要按类型搜索商品,再根据搜索结果选择满意的商品。

UML序列图

在发出搜索条件之后,等待搜索结果,才能从结果中选择商品。在搜索结果返回之前,用户处于等待状态。若结果中有满意的就购买,没有就退出。

除了仅显示序列图上的同步消息外,上图中还包括返回消息。这些返回消息是可选择的;一个返回消息画作一个带开放箭头的虚线,在这条虚线上面,可以放置操作的返回值。

在开始创建模型的时候,不要总是想着将返回值限制为一个唯一的数值,要将注意力集中在所需要的信息上面,尽可能在返回值里附带所需要的信息,一旦确认所需的信息都已经包含进来,就可以将它们封装在一个对象里作为返回值传递。

此外,返回消息是序列图的一个可选择部分。是否使用返回消息依赖于建模的具体/抽象程度。如果需要较好的具体化,返回消息是有用的;否则,主动消息就足够了。因此,有些建模人员会省略同步消息的返回值,即假设已经有了返回值。虽然这是一种可行的方法,但最好还是将返回消息表示出来,因为这有助于确认返回值是否和测试用例或操作的要求一致。

异步消息

异步消息表示发送消息的对象不用等待响应的返回消息,即可开始另一个活动。异步消息在某种程度上规定了发送方和接收方的责任,即发送方只负责将消息发送到接收方,至于接收方如何响应,发送方不需要知道。对接收方来说,在接收到消息后,它既可以对消息进行处理,也可以什么都不做。从这个方面看,异步消息类似于收发电子邮件,发送电子邮件的人员只需要将邮件发送到接收人的信箱,至于接收电子邮件方面如何处理,发送人则不需要知道。

下面的示例演示了如何在登录中使用异步消息。

公园售票员在售票时,打印一张门票,向系统发出消息之后并不用等待系统做出反应,除非系统有错误提示。接着可以打印下一张门票,如下图所示。

UML序列图

当两个对象之间全部是异步消息时,也表示这两个对象没有任何关系。这样可以使系统的设计更为简单。

最常见的实现异步消息的方式是使用线程。当发送该异步消息时,系统需要启动一个线程在后台运行。

消息的条件控制

在UML中,消息可以包含条件以限制它们只在满足条件时才能被发送。这里的条件分为多种,如if类型的条件,if…else类型的条件,switch…case类型的条件。

在UML早期版本中使用条件和消息名来实现对满足条件消息的发送,在UML2中使用多种组合碎片来控制消息的发送,包含“变体”“选择项”和“循环”组合碎片等。这3个组合碎片是大多数人将会使用最多的。

如下图所示的选择项组合碎片option,这是最简单的条件控制消息,用户登录输入密码,验证过后,在密码有误的情况下重新登录。只存在消息产生的条件,不存在条件不发生时的消息,即只有一个if语句,没有else语句。

UML序列图

除了上图的例子外,还有多种其他条件限制。将组合碎片发生的每一种可能性定义为操作域,则option组合碎片只有一个操作域。
序列图碎片矩形的左上角包含一个操作符,以指示该序列图碎片的类型。组合碎片操作符及其详细说明如下表所示。

UML序列图

如下图所示的图书借阅系统,当读者手中已经借阅的图书超过5本时,将无法继续借阅;当读者有逾期图书尚未归还时,需要归还图书才能继续借阅;读者借阅书籍不超过5本并且没有逾期书籍时,将成功添加借阅信息。

UML序列图

对于某碎片而言,它并不需要额外的参数作为其规范的一部分。序列图碎片矩形与序列图中某部分交互重叠。

序列图碎片中可以包含任意数目的交互,甚至包含嵌套碎片。组合碎片除了可以用来限制消息的调用,还可以分解复杂序列图,如ref操作符。

ref类型的序列图碎片从字面上理解为引用(reference),ref碎片实际表示该碎片是一张更大的序列图的一部分。这意味着可以将一个庞大而复杂的序列图分解为多个ref碎片,从而减轻了为复杂系统创建大型序列图所带来的维护困难。

如下图所示,将考务系统的考生排序、分组、分考场以及考场安排封装为一个ref类型碎片。

UML序列图

顺序碎片使得创建与维护序列图更加容易。然而,任何碎片都不是孤立的,序列图中可以混合与匹配任意数目的碎片,精确地为序列图上的交互建模。

消息中的参数和序号

序列图中的消息除了具有消息名称外,还可以包含许多附加的信息。例如,在消息中包含参数、返回值和序列表达式。

消息可以与类中的操作等效。消息可以将参数列表传递给被调用对象,并且可以包含返回给调用对象的返回值。

如下图所示,传递的消息包含了密码参数。

UML序列图

当序列图中的消息比较多时,还可以通过对消息前置序号表达式来指定消息的顺序。顺序表达式可以是一个数值或者任何对于顺序有意义的基于文本的描述。在下图所演示的示例中,对序列图中的消息添加了序列表达式。

UML序列图

从该图中可以看出第一个被发送的消息是查询消息,接下来是商品信息对象返回的消息。这样在消息比较繁多时,消息被发送的次序便一目了然。

分支和从属

有两种方式来修改序列图的控制流:使用分支和使用从属流。控制流的改变是由于不同的条件导致控制流走向不同的道路。
分支允许控制流走向不同的对象,如下图所示。

UML序列图

需要注意:分支消息的开始位置是相同的,分支消息的结束“高度”也是相同的。这说明在下一步的执行中有一个对象将被调用。如上图所示,当用户拥有打印权限后,控制流将转向打印机对象,而当用户没有打印权限时,将发送一个无打印权限的提示对话框给用户。

与分支消息不同,从属流允许某一个对象根据不同的条件执行不同的操作,即创建对象的另一条生命线分支,如下图所示。

UML序列图

在上面的示例中,信息管理系统会根据用户选择删除信息还是保存信息发送消息。很显然,数据资源将执行两种完全不同的活动,并且每一个工作流都需要独立的生命线,如上图所示。

激活

当一条消息被传递给对象时,会触发该对象的某个行为,这时该对象就被激活了。在生命线上,激活用一个细长的矩形框表示。矩形本身被称为对象的控制期,控制期说明对象正在执行某个动作。

通常情况下,表示控制期矩形的顶点是消息和生命线相交的地方,而矩形的底部表示的行为已经结束,或控制权交回消息发送的对象。

序列图中一个对象的控制期矩形不必总是扩展到对象生命线的末端,也不必连续不断。

激活期本身从一条信息的发出或接收开始,到最后一条信息的发出或接收结束;激活期的垂直长度粗略地表示信息交互持续的时间。如下图所示,用户进入并激活了购物系统,在系统内进行查询又激活了商品信息系统。

UML序列图

序列图中的对象在序列图中并不一定是开始就有的。事实上,序列图中的对象并不一定需要在序列图的整个交互期间存活,对象可以根据传递进来的消息创建或销毁。

赞(1)
未经允许不得转载:极客笔记 » UML序列图 构成元素
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址