在前面我们学习了类图相关知识,类图是一种静态结构模型视图,它是设计类及类间关系(即数据结构)的重要依据,但它无法刻画类的对象间的交互/通信行为,也就是说,类图无法描述类和类之间是如何通信、交互的,通俗地说,类图无法描述某个类的方法被哪个类所调用,这就需要用到时序图。
1.什么是时序图?
时序图(Sequence Diagram),亦称为序列图或循序图或顺序图,是一种UML行为图(或交互图)。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,时
序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件。
时序图是一个二维平面直角坐标系图,横轴表示对象,纵轴表示时间,消息在各对象之间横向传递,依照时间顺序纵向排列。例如:
2.时序图的作用
时序图是一种动态的、行为模型视图,可以用来描述在程序运行期间,某个类的方法被哪个类在哪个阶段所调用。它的作用概括如下:
将交互行为建模为消息传递,通过描述消息是如何在对象间发送和接收的来动态展示对象之间的交互;
展示对象之间交互的顺序。相对于其他UML图,时序图更强调交互的时间顺序;
可以直观地描述并发程序。
通俗地说,时序图可以直观地刻画对象之间传递消息的过程, 也就是面向对象编程中不同对象间方法调用的过程。
3.时序图的组成元素
时序图的组成元素包括:角色(Actor)、对象(Object)、生命线(Lifeline)、激活期(Activation)、消息(Message)和组合片段(Combination Fragment)。下面对这些元素进行详细介绍。
图3-1时序图的组成元素
3.1.角色(Actor)
访问当前功能的系统角色,可以是人、机器或者其他系统,子系统。实际上角色是一种特殊的对象,它是时序图中的消息的发起源。例如,用户可以通过应用首页的菜单访问到具体的功能,此时用户就充当了这些功能应用的系统角色;某公司的内部系统需要调用第三方支付系统的接口以实现支付转账功能,此时内部系统就充当了调用第三方支付系统接口的系统角色。在UML中,通过如下组件表示一个角色:
图3.1-1时序图的角色
3.2.对象(Object)
3.2.1.对象的图示
在时序图中,对象代表时序图中的对象在交互中所扮演的角色,位于时序图顶部。通俗地说,对象表示能够发起消息交互的个体,对应Java中的模块、类或类的实例。例如,下图表示时序图的一个对象:
3.2.2.对象的命名规则
对象包括三种命名方式:
第一种方式包括对象名类名,即对象名:类名;例如:
第二中方式只显示类名不显示对象名,表示一个匿名对象,即:类名(包括类名前面的冒号);例如:
第三种方式只显示对象名不显示类名,即对象名(不包括冒号)。例如:
3.2.3.对象的创建时机
对象可以在交互开始的时候创建, 也可以在交互过程中进行创建。
处于顶部: 如果对象的位置在时序图顶部, 说明在交互开始的时候对象就已经存在了;
不在顶部: 如果对象的位置不在顶部, 那么对象在交互过程中创建的。
例如:
3.3.生命线(Lifeline)
生命线是指对象的生命周期。在时序图中,存在一条从对象图标向下延伸的虚线,这条虚线就是对象的生命线,生命线是一条时间线,用来描述对象存在的时间。例如:
在Java中,生命线的起点对应对象的创建时间点,生命线的终点对应对象被销毁/回收的时间点,因此当对象的创建时间不一致时,这两个对象在Y轴方向会处于不同的高度。
3.4.激活期(Activation)
3.4.1.激活期的定义
在时序图中,激活期又称控制焦点(Focus of Control),用来表示对象执行一项操作所耗费的时间。激活期是一个时间区间符号,在这个时间区间内对象将执行相应的操作。在对象的生命线上,用一个纵向的小矩形表示一个激活期。例如:
3.4.2.生命线的两种状态
对象的生命线包括两种状态:激活状态和空闲状态。
(1)激活状态:生命线上的小矩形表示对象在该时间区间内正处于激活状态,即正在执行某个操作。在Java中,对象的激活期表示有线程正在执行此对象中的某个方法;
(2)空闲状态:生命线上的虚线部分表示对象在该时间区间内处于空闲状态,也就是说,处于空闲期的对象不会执行任何操作,但仍属于该对象的生命周期内;
(3)对象的生命线或生命周期 = 激活期间 + 空闲期间。
3.4.3.角色是否需要添加激活期?
首先角色是一种特殊的对象,因此它可以添加激活期,角色是否有必要添加激活期不能一棒子打死,要视实际情况而定。我们知道,时序图主要是体现对象间的行为交互,因此是否要添加激活期,要从激活期的定义去理解——激活期最重要的特点是正在执行某一项操作,因此,如果角色执行了某项操作,那么为了刻画角色的当前状态,建议加上激活期。例如,角色是一个系统或模块,该角色在访问另一个系统或模块的接口时,由于访问这个动作的执行者是该角色(访问动作的接收者是另一个系统或模块),因此就可以为角色加上激活期。
需要注意的是,在StartUML中,目前还不能很好地支持调整角色激活期的高度,我们可以在角色中设置一个可调整高度的“小矩形”来自定义角色的激活期:
3.5.消息(Message)
3.5.1.消息的定义
消息(Message)用于对实体间的通信内容建模,对象间通过发送和接受信息进行通信,是对象间传递信息的方式。在Java中,时序图的消息用来表示方法。在UML中,消息用一条带箭头(即三角形箭头 )的实线或开放型箭头( )的实线及虚线和消息序号:消息名称表示,其中,箭头表示消息的执行方向,由执行者指向被执行者。例如:
对上述消息的理解:用户作为序号为1且名称为Message1的消息的执行者,用户的激活期表示正在执行消息Message1所对应的行为(在Java中表示某个方法),并由对象Object作为消息Message1所传递信息的接收者,对象Object的激活期表示正在执行与[消息Message1所传递的信息]相关的一系列行为。
3.5.2.消息的分类
根据消息的行为特征,可将其分为同步消息(Synchronous Message)、异步消息(Asynchronous Message)、返回消息(Return Messgae)和自关联(或自调用)消息(Self-Message)。
3.5.2.1.同步消息(Synchronous Message)
消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制,用来表示同步的意义。在UML中,同步消息以一条实线+实心箭头表示:
同步消息对应Java中的同步方法,简单来说,同步消息就是等到接收消息的对象执行完相应的行为后,消息的发送者才能执行下一步的行为。例如,现在有以下业务需求:
(1) 用户登录移动应用首页;
(2) 单击首页的菜单图标进入单据列表页面;
(3) 单击单据列表行进入表单编辑页后,才可以执行保存、提交操作;
(4) 提交完成后,跳转到表单详情页才可以在表单详情页执行审核操作。
分析:先保存、提交,再审核,这是典型的同步操作,因此我们可以使用时序图的同步消息进行UML建模:
第一步:确认需求中所涉及的角色和对象;
第二步:分析对象间涉及的交互行为;
第三步:分析每一步中消息的类型。
对应的时序图如下所示。
对应的Java代码实现如下所示:
package com.yzh.demo.uml.sd;
/** * @description: 应用首页 * @author: yzh * @date: 2022-06-10 21:50 */
public class AppHome {
public void click() {
goListPage();
}
private void goListPage(){
System.out.println("跳转到列表页...");
ListPlugin plugin = new ListPlugin();
plugin.init();
}
}
package com.yzh.demo.uml.sd;
/** * @description: 列表页插件 * @author: yzh * @date: 2022-06-10 21:53 */
public class ListPlugin {
public void init(){
display();
}
private void display(){
System.out.println("列表页面加载成功...");
}
public void click() {
goEditPage();
}
private void goEditPage(){
System.out.println("跳转到编辑页...");
EditPlugin plugin = new EditPlugin();
plugin.init();
}
}
package com.yzh.demo.uml.sd;
/** * @description: 编辑页插件 * @author: yzh * @date: 2022-06-10 21:57 */
public class EditPlugin {
public void init(){
display();
}
private void display(){
System.out.println("编辑页面加载成功...");
}
public void saveService() {
save();
}
public void submitService() {
submit();
}
private void save() {
System.out.println("保存成功...");
}
public void submit() {
System.out.println("执行提交操作...");
goViewPage();
}
private void goViewPage(){
System.out.println("跳转到详情页...");
ViewPlugin plugin = new ViewPlugin();
plugin.init();
}
}
package com.yzh.demo.uml.sd;
/** * @description:详情页插件 * @author: yzh * @date: 2022-06-10 22:06 */
public class ViewPlugin {
public void init(){
display();
}
private void display(){
System.out.println("详情页面加载成功...");
}
public void auditService(){
audit();
}
private void audit() {
System.out.println("审核成功...");
}
}
package com.yzh.demo.uml.sd;
/** * @description: * @author: yzh * @date: 2022-06-10 22:00 */
public class Client {
public static void main(String[] args) {
AppHome appHome = new AppHome();
// 1.点击应用首页菜单菜单
appHome.click();
// 2.单击列表分录行
ListPlugin listPlugin = new ListPlugin();
listPlugin.click();
// 3.保存操作
EditPlugin editPlugin = new EditPlugin();
editPlugin.saveService();
// 4.提交操作
editPlugin.submitService();
// 5.审核操作
ViewPlugin viewPlugin = new ViewPlugin();
viewPlugin.auditService();
}
}
//~output:
跳转到列表页...
列表页面加载成功...
跳转到编辑页...
编辑页面加载成功...
保存成功...
执行提交操作...
跳转到详情页...
详情页面加载成功...
审核成功...
3.5.2.2.异步消息(Asynchronous Message)
消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。在UML中,异步消息以一条实线+大于号表示:
异步消息对应Java中的异步方法,简单来说,异步消息不需要等待接收消息的对象执行完相应的行为就可以执行下一步的行为。例如,现在有以下业务需求:
(1)用户登录移动应用首页;
(2)单击首页的菜单图标进入单据列表页面;
(4)选中已提交状态的单据,跳转到表单详情页后,可在表单详情页执行审核操作,执行审核操作的同时,会同时记录操作的日志信息。
分析:审核过程中会同时记录操作的日志信息,这是典型的异步操作,因此我们可以使用时序图的异步消息进行UML建模:
注意到,在上述时序图中,由于saveLog()异步方法是自关联消息,无法通过异步消息表示,因此只能通过并发组合片段(Par)表示,可见并发组合片段(Par)和异步消息都有各自的适用场景。
3.5.2.3.返回消息(Return Messgae)
返回消息表示从过程调用返回。需要注意地是,这里的“返回”不仅仅指的是方法的返回值,还应当包括页面提示语甚至是过程调用结束标识等广义上的“返回信息”。在UML中,返回消息用以小于号+虚线表示。例如:
3.5.2.4.自关联消息(Self-Message)
自关联消息(Self-Message)又称自调用消息,表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。在UML中,自关联消息以一个半闭合的长方形+实心箭头表示。例如:
3.6.组合片段(Combination Fragment)
3.6.1.组合片段的基本概念
在上面3.5.2.2章节中,我们使用到了并发组合片段,本章节我们继续深入学习组合片段。组合片段(Combination Fragment)用来解决交互执行的条件和方式,它允许在时序图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。组合片段共有12种,名称及含义如下:
3.6.2.在StartUML中使用组合片段
第一步:创建组合片段
第二步:选择组合片段类型
第三步:检查并设置组合片段的参数
3.6.3.常用组合片段举例
3.6.3.1.opt组合片段
opt组合片段的模型如下所示:
现有以下需求,试在时序图中使用opt组合片段实现之:
提交单据时,若操作失败则需要记录日志;
对应的时序图如下所示。
3.6.3.2.alt组合片段
alt组合片段的模型如下所示:
现有以下需求,试在时序图中使用alt组合片段实现之:
(1)用户登录移动应用首页需填写账号和密码;
(2)若账号和密码填写正确,则验证通过并跳转到移动应用首页,否则提示“账号或密码错误”。
对应的时序图如下所示。
3.6.3.3.loop组合片段
loop组合片段的模型如下所示:
Jenkins是一种是基于Java开发的持续集成工具,可对代码进行定时构建。尝试用loop组合片段描述Jenkins的定时构建的工作原理:
上图表示Jenkins每天凌晨0点、中午12点和下午5点整定时触发构建流程。
扩展:break组合片段通常与loop组合片段一起使用,对应的模型如下所示。
3.6.3.4.par组合片段
par组合片段用来表示包含在该片段中的各个交互会并发执行。par组合片段的模型如下所示:
现有以下需求:
(1)用户登录移动应用首页;
(2)单击首页的菜单图标进入单据列表页面;
(4)选中已提交状态的单据,跳转到表单详情页后,可在表单详情页执行审核操作,执行审核操作的同时,会同时记录操作的日志信息。
分析:审核过程中会同时记录操作的日志信息,这是典型的异步操作,因此我们可以使用par组合片段进行UML建模:
4.时序图设计步骤
一个完整的时序图的设计应当按如下步骤进行:
第一步:确认需求中所涉及的角色和对象;
第二步:分析对象间涉及的交互行为;
第三步:分析并确认每一步的消息类型;
第四步:根据上述三步的分析结果画出对应的时序图。
下面我们以微信支付的基本流程为例,分析下时序图的一般设计步骤:
(1)用户点击微信扫一扫功能;
(2)微信返回扫码界面给用户;
(3)用户使用微信扫描商家收款码;
(4)微信识别商家收款码;
(5)微信弹出支付密码对话框,提示用户输入支付密码;
(6)用户输入微信支付密码;
(7)微信验证用户输入密码正确;
(8)微信向商家(微信)汇款;
(9)商家(微信)返回支付结果给微信;
(10)微信返回支付结果给用户。
4.1.确认需求中所涉及的角色和对象
从上面的支付流程逻辑可知,角色为用户,对象包括用户微信(简称微信)和商家微信(简称商家)。因此我们先设计好时序图的基础框架:
4.2.分析对象间涉及的交互行为
根据原始需求,可将对象间的交互行为拆分为如下三类:
(1)用户和微信之间的交互行为
用户点击微信扫一扫;
微信返回扫码界面给用户;
用户使用微信扫描商家收款码;
微信弹出支付密码对话框,提示用户输入支付密码;
用户输入微信支付密码;
微信返回支付结果给用户。
(2)微信自关联行为
微信识别商家收款码;
微信验证用户输入密码正确。
(3)微信和商家之间的交互行为
微信向商家(微信)汇款;
商家(微信)返回支付结果给微信。
4.3.分析并确认每一步的消息类型
(1)同步/异步消息
用户点击微信扫一扫;
用户使用微信扫描商家收款码;
用户输入微信支付密码;
微信向商家(微信)汇款。
(2)返回消息
微信返回扫码界面给用户;
微信弹出支付密码对话框,提示用户输入支付密码;
微信返回支付结果给用户;
商家(微信)返回支付结果给微信。
(3)自关联消息
微信识别商家收款码;
微信验证用户输入密码正确。
4.4.画出时序图
根据4.1、4.2和4.3章节的分析结果,微信支付的基本流程对应的时序图如下所示。
今天的文章uml时序图怎么画实例_根据时序图设计一个梯形图控制程序分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/82863.html