UML建模与软件开发设计(七)——时序图设计

2023-11-15

在前面我们学习了类图相关知识,类图是一种静态结构模型视图,它是设计类及类间关系(即数据结构)的重要依据,但它无法刻画类的对象间的交互/通信行为,也就是说,类图无法描述类和类之间是如何通信、交互的,通俗地说,类图无法描述某个类的方法被哪个类所调用,这就需要用到时序图。
在这里插入图片描述

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章节的分析结果,微信支付的基本流程对应的时序图如下所示。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UML建模与软件开发设计(七)——时序图设计 的相关文章

随机推荐

  • React学习-推箱子游戏

    游戏效果图 共100关 代码地址 https download csdn net download qq 20698983 12740361 目录 简述 游戏布局 按键监听 推动箱子和移动人物 判断胜利 步数器 上一关 下一关 返回上一步
  • 只用一个typeC线连接树莓派4B(同时完成供电、信号传输、网络共享三合一)

    方法一 使用静态IP 供电 信号传输二合一 一 优缺点 优点 在每次连接树莓派时 无需重新查找树莓派的地址 缺点 无法使用网络共享的功能 网络共享就是可以将你电脑上的网络通过typeC共享给树莓派 这样树莓派就无需连接网络 二 树莓派上的配
  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务 架构组件之网关 Spring Cloud Gateway 引言 微服务架构已成为构建现代化应用程序的关键范式之一 它将应用程序拆分成多个小型 可独立部署的服务 Spring Cloud Gateway是Spring Cloud生态系
  • Linux下屏保程序

    http www openswc com forum php mod viewthread tid 560 利用一些便捷的小软件把自己的数码相片做成绚烂多彩的屏保 放在自己的电脑上该是多么惬意的一件事啊 虽然Linux下制作屏幕保护的软件比
  • ICCV2021-TOCo-微软&CMU提出Token感知的级联对比学习方法,在视频文本对齐任务上“吊打”其他SOTA方法...

    关注公众号 发现CV技术之美 0 写在前面 对比学习已被广泛应用于训练基于Transformer的视觉语言模型的视频文本对齐和多模态表示学习等任务 在本文中 作者提出了一种新的token感知级联对比学习 TACo 算法 该算法利用两种技术改
  • 修改mysql连接回收时间_记一次生产环境数据库连接超时自动回收问题及解决方法...

    java sql SQLNonTransientConnectionException No operations allowed after connection closed at com mysql cj jdbc exception
  • ipykernel操控jupyter内核命令&在jupyter lab中使用conda创建的虚拟环境

    想在jupyter lab中使用conda创建的虚拟环境 只需要在命令行中激活环境 并且为其安装ipykernel即可 首先进入base环境中的jupyterlab给大家展示一下 并且给大家展示我所有的conda环境 其中 jupyter中
  • Java 多线程 --- 线程状态 Thread States

    Java 多线程 线程状态 Thread States New Threads Runnable Threads Blocked and Waiting Threads Terminated Threads New Threads 当用ne
  • 持续集成是什么?

    作者 阮一峰 日期 2015年9月23日 互联网软件的开发和发布 已经形成了一套标准流程 最重要的组成部分就是持续集成 Continuous integration 简称CI 本文简要介绍持续集成的概念和做法 一 概念 持续集成指的是 频繁
  • MyBatis流式查询

    MyBatis流式查询 1 应用场景说明 MyBatis preview JDBC三种读取方式 1 一次全部 默认 一次获取全部 2 流式 多次获取 一次一行 3 游标 多次获取 一次多行 在开发中我们经常需要会遇到统计数据 将数据导出到e
  • tomcat报错 Unable to process Jar entry

    错误描述 tomcat启动报下边的这个错 错误现象 09 Jul 2019 13 34 14 635 严重 RMI TCP Connection 3 127 0 0 1 org apache catalina startup Context
  • ORA-14402: 更新分区关键字列将导致分区的更改

    默认情况下 oracle的分区表对于分区字段是不允许进行update操作的 如果有对分区字段行进update 就会报错 ORA 14402 更新分区关键字列将导致分区的更改 但是可以通过打开表的row movement属性来允许对分区字段的
  • [JAVAee]Spring项目的创建与基本使用

    目录 Spring项目的创建 Spring中Bean对象的存储与获取 存储Bean对象 获取并使用Bean对象 getBean方法的重载 本文章介绍了Spring项目创建与使用的过程与一定的注意事项 Spring项目的创建 首先在IDEA中
  • 以太坊 Truffle实战

    目录 搭建私连网络 truflle初始化项目 智能合约示例 通用存证合约 初始化参数 接口 简易审批合约 初始化参数 数据结构 接口 智能合约的建立 谁在与智能合约交互 智能合约的销毁 整个过程主要演示chrome扩展 METAMASK O
  • 电源层和地线层完整性规则_电路设计规则

    电路图设计规则 一 电路设计流程 1 根据需求文件开始进行原理图设计 2 选择设计所需元器件 加载所需元件库 如果现有元件库没有所需元件 需自己制作 新制作的元器件要求功能形象化 标示准确化 选择合适的电路用于自己的设计完成相应的功能 确定
  • Unable to install breakpoint in XXX due to missing line number attributes.

    今天调试程序的时候 eclipse 弹出来一个 Unable to install breakpointdue to missingline number attributes Modify compileroptions togenera
  • 01.神经网络和深度学习——week2 神经网络基础(编程作业)

    Part 1 Python Basics with Numpy optional 1 Building basic functions with numpy 1 1 Sigmoid function np exp exe Build a f
  • Unity游戏开发客户端面经——C#(初级)

    前言 记录了总6w字的面经知识点 文章中的知识点若想深入了解 可以点击链接学习 由于文本太多 按类型分开 这一篇是C 常问问题总结 有帮助的可以收藏 1 引用类型 值类型 1 1 介绍 值类型 int bool float char str
  • 持续集成管理软件Jenkins应用实验

    编写Dockerfile文件 1 创建一个目录jenkins 保存相关的配置信息和内容 在 后输入mkdir Jenkins cd Jenkins命令 然后按Enter键 创建Jenkins目录并进入该目录 示例代码如下 root xian
  • UML建模与软件开发设计(七)——时序图设计

    在前面我们学习了类图相关知识 类图是一种静态结构模型视图 它是设计类及类间关系 即数据结构 的重要依据 但它无法刻画类的对象间的交互 通信行为 也就是说 类图无法描述类和类之间是如何通信 交互的 通俗地说 类图无法描述某个类的方法被哪个类所