UML之序列图的参与者与生命线

3周前发布 gsjqwyl
13 0 0

UML之序列图的参与者与生命线

序列图是建模过程里不可或缺的一种用于描述行为的手段,它展现出在某些有效的行为中元素之间的消息交互以及相互作用情况。交互是构成行为的一个单元,而这些元素必须是能够连接的元素,通常把这类可连接元素称作交互中的参与者(Participants)。

序列图里的参与者并非类或者对象(这和众多建模者的认知不一样),它们更趋近于协作中的类型化角色或者结构化分类器的一部分(实际上是组合关系中的部分)。它们的命名格式是“角色名:类型名”,其中用冒号把名称分成两部分,两部分中任何一部分都能够为空,但不允许同时为空。由于它们不是对象,所以不能给参与者名称加下划线(不过在UML的早期版本中允许这么做)。当省略“角色名”时,能够用指定类型的任意参与者来替代。“类型名”一般是类或者数据类型的名称,当省略“类型名”时,任何指定角色的参与者都应该是在当前场景下适用且足够的,不管它属于哪个类或者数据类型。

在“角色名”之后,或许会看到由方括号包含的选择器“[selector]”,选择器用来指示当前打算使用的多值角色中的某个元素,但它并非参与者名称的一部分。在实际应用中,selector通常是一个整数值索引,用于指向给定类型元素数组中的一个元素。

下面的图(图1)是一幅简单的序列图:

图1 简单序列图

图中包含两个参与者:Patron类型的角色current和CirculationSystem类型的匿名角色。如前所述,参与者名称还能够是有角色名但缺少类型名的形式。

序列图中的参与者必定是“可连接元素”,这些参与者一般描绘在序列图的顶部,并用一个矩形表示,矩形内部是参与者名称,正如图1所展示的那样。不过依据参与者的不同构造型,它还有其他一些不同的表示形式,常见的一些形式如图2所示。

图2 参与者的不同图示

在实际建模中,一些建模者会把用例图中的参与者(Actors)当作序列图中的参与者(Participants)。然而遗憾的是,在UML规范中,用例图中的参与者(Actors)不能作为序列图中的可连接元素,也就是序列图中不应该出现参与者(Actors)。但另一方面,几乎所有的UML工具都支持把用例图中的参与者(Actors)当作序列图中的参与者(Participants)来使用。这种用法通常被认为是合理的,当系统视角或者边界发生变化时,比如序列图描述一个子系统时,所有其他与当前子系统有交互的子系统都将被视为参与者(Actors),但实际上,所有这些子系统最终都只是整个系统的一部分。包含一个参与者(Actors)的序列图例子如图3所示。

图3 包含Actor的序列图

在序列图顶部的这些参与者(Participants)都向下延伸出一条虚线,这条虚线被称作“生命线”。每条生命线表示一个按时间顺序排列的事件(称为发生事件)序列,这些事件在生命线上按照从上到下的顺序发送或者接收。在图1中显示Patron先向CirculationSystem发送一条名为mayIBorrowBooks的消息,随后CirculationSystem回复了一条yesYouMay消息。

从单独一条时间线的角度来看,从图的顶部到底部代表时间顺序。所以,在Patron这一端,yesYouMay消息是在Patron发送mayIBorrowBooks消息之后接收到的;而在CirculationSystem这一端,mayIBorrowBooks消息是在它发送yesYouMay消息之前接收到的。

不同时间线之间位于同一水平线上的事件并不意味着它们在同一时间发生,比如对于mayIBorrowBooks消息,虽然在图1中,它在Patron端和CirculationSystem端处于同一水平位置,但很容易想到,即使mayIBorrowBooks消息能够很快从Patron端发送到CirculationSystem端,也一定是Patron端的发送时间早于CirculationSystem端的接收时间。

通常,参与者之间的消息以括号结尾,比如mayIBorrowBooks()。在进行业务建模时,由于消息表达的还是概念层级的交互,它旨在给读者一个关于正在发生之事的概念,而不力求形式上的正确或者指定详细的实现细节,因而使用括号的情况较少。而在功能建模时,比如描述类或者进程之间的交互,括号用于表示要传递的参数,此时参数有助于说明通过消息传递的具体信息,对该层级的建模使用括号并标明参数是有用且必要的。

在序列图中,参与交互的生命线的头部通常都对齐在图的顶部。不过生命线也能够在交互过程中创建,在这种情况下,头部位于创建点,而在创建点之下,新创建的生命线能够与已经存在的生命线进行交互。图4展示了这种情况,生命线Lifeline2创建生命线Lifeline3,而此后Lifeline2与Lifeline3之间就如同一开始就存在的生命线一般展开交互。

图4 在交互过程中创建生命线

在交互过程中创建的生命线在其被创建的时刻才开始有“生命”,但从序列图顶端开始的生命线并不是在当前序列图描述的交互开始时被创建的,它们可能在序列图所描述的交互开始前就已经存在。同样地,当序列图所描述的交互结束之后,它所涉及的各条生命线也并没有终结,而是继续存在。类似于能够在序列图交互过程中创建一条生命线,也能够在交互过程中终结某条生命线。终结生命线的符号是在生命线终结处画上一个大大的“×”,如图5所示。

图5 生命线终止

一条生命线一旦被终结,就不能够再参与序列图中的后续交互。

© 版权声明

相关文章

暂无评论

暂无评论...