序列图(Sequence Diagram),又称顺序图或时序图,它是描述对象行为的一种交互视图。
序列图描述某个业务场景的行为,它关注对象之间消息传送的时间顺序。
如在图书馆借阅系统中,图书馆工作人员帮助读者完成图书借阅的业务场景、帮助读者完成还书的业务场景、读者在线预借图书的场景等。
序列图的主要用途是为用例进行逻辑建模,对用例所表达的需求进行更加精细的表达。
序列图主要包括对象、生命线、消息和激活4种元素。
在UML中,序列图将交互关系表示为一张二维图。其中,纵向为时间轴,时间沿竖线向下延伸。横向是对象维,在这一维度上水平排列着参与交互的各个对象。
对象是类的一个实例或一组实例。UML中对象的图形有下面三种情形:
(1)对象名+对象所属的类名
(2)只有对象名(省略类名)
(3)只有类的名称(匿名对象)
三种对象的表示方法如下图所示:
不管使用哪种形式的对象,其名称下面都有一条下划线,以表明其是对象元素。
生命线代表了一次交互中的一个参与对象在一段时间内的存在。
在序列图中,生命线位于每个对象的底部中心位置,显示为一条垂直的虚线,与时间轴平行。
消息是从一个对象(发送者)向另一个对象(接收者)发送信号,或由一个对象(发送者或调用者)调用另一个对象(接收者)的操作。
在序列图中,消息表示为从一个对象的生命线指向另一个对象的生命线的箭头。
消息的类型主要包括简单消息、同步消息、异步消息、返回消息四种。另外,还有一种消息是对象向自己发送消息的自反消息。
(1)简单消息
简单消息可以泛指对象之间的任何消息调用或发送,而不必关心是异步还是同步的。
(2)同步消息
对象发送消息后,需要接收消息的对象响应完毕并返回消息时才会进行其余的工作。
(3)异步消息
对象发送消息后,不需要等待接收对象的返回消息可以继续执行其余的工作。
(4)自反消息
也是简单消息的一种,不过是对象向自己发送消息,而不是其它的对象。
激活表示一个对象执行一个动作所经历的时间段。
一般情况下,当一个对象收到其它对象发送的消息时被激活,在激活期内处理该消息,激活结束时应该发出一个消息。
在UML中使用处于生命线上的垂直长条矩形来表示。矩形的开始处为对象开始操作动作,底部表示操作动作的结束。
删除标志使用一个“×”来表示。其位于对象生命线的低端,表示删除对象。
建模顺序:
(1)设置交互的语境:哪个系统?哪些类?哪个用例?用例的哪些脚本?
(2)设置交互场景:识别对象在交互中扮演的角色。
(3)为对象设置生命线:很多建模工具在对序列图建模时,对象自带生命线。
(4)设置消息,从引发交互的消息开始,按时间顺序考虑对象之间产生的消息,及消息的特征(参数、返回值类型等)。
(5)设置激活期,Rose工具在建模时,当绘制消息时,自动创建激活,根据需要可以改变激活期的大小,有些工具需要设计人员专门拖拽一个激活期到对象的生命线上。
(6)设置其它约束及条件。如时间的约束、循环的约束,消息的条件等。
S校图书馆借阅系统中,图书管理员处理借阅信息,即用例图中的借阅图书。
(1)确定主流程
读者把要借阅的书籍送到借阅台;
图书馆工作人员在登录系统后进入图书借阅界面;
读者刷取借阅证;
系统获取读者信息和已借阅的图书信息列表;
在没有欠款、没有超期图书,且已借阅数量未达到限制时,图书馆工作人员使用扫描枪扫描每本待借书籍;
系统通过业务逻辑层获取图书的信息,并添加到借阅列表中;
图书馆工作人员保存借阅信息,完成借阅。
(2)确定序列图中参与交互的对象
主要包括:图书馆工作人员、借阅界面、借阅列表、业务逻辑层、数据库等
(3)绘制序列图
这里只包含基本流程:获取读者信息->扫描图书->保存借阅->结束借阅。
而对于验证读者可借阅册数、是否有超期或是否有欠款信息等可以在额外的序列图中绘制。以免使得序列图变得过于庞大。
(4)注意事项
如在建模过程中,用例或业务比较复杂,可以将用例流程拆解为基本流程和若干备选流程,在绘制备选流程中只绘制与主流程不同的地方即可。
如在借阅图书这个用例中,有超期信息及有罚款信息时不能进行借阅,这时可以分别单独绘制序列图。而有罚款信息时,如读者选择图书馆工作人员处理罚款信息,则在序列图中只绘制相关消息,具体的罚款处理可以参考罚款处理的序列图。
序列图可以在分析中获取用户操作的大致过程,这时的序列图可以粗一些,完全可以把系统看成黑盒对象,在设计中可以进一步的细化,使设计人员更能清楚各个类对象之间如何实现交互。
在UML2.x中,提供了更加丰富的功能来描述现实中的建模要求,在序列图部分也添加了不少元素,如片段,这样可以帮助建模人员方便的描述循环消息、条件消息、并行消息等。当然UML2.x使建模本身也变得极其复杂。
那么在UML1.x中如何恰当的表示这些信息呢?
有可能对象的某个操作需要循环调用消息,这时可以借助下面的方法:
*[for all borrowing books]:scanBooks()
这里表示图书馆工作人员需要对每本待借书籍执行扫描操作,需要多次调用借阅界面的scanBooks()操作。
上面这种适用于调用数量不确定的情形,对于确定调用次数的情形可以使用下面的方法:
*[i:=1..n]: connectServer(connInfo)
这里表示connectServer()消息最多执行n次。
一种方法是可以在条件前加上警戒条件,如:
[borrowNum<=20]:getBookInfo(barCode)
这里表示当借阅图书数量未超过20时,借阅界面才会向业务逻辑层请求获取图书信息。
也可以在序列图中使用下面的方法来表示:
有时,我们可能需要表示发送消息和返回消息之间的间隔要小于指定时间,这时也可以在序列图中使用某种特殊方法来表示。
以上内容介绍了UML中序列图的概念、构成元素以及绘制序列图的步骤,并给出了一个样例。希望你读完这篇文章对你的知识海洋有所补充。
新闻热点
疑难解答