技术咨询、项目合作、广告投放、简历咨询、技术文档下载 点击这里 联系博主

# 时序图详解及在MVC中的应用

# 一、什么是时序图

时序图(Sequence Diagram),又名序列图、循序图,是一种 UML 交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。序列图显示元素随着时间的推移而相互作用,它们根据对象(水平)和时间(垂直)组织;

# 对象维度

  • 横轴表示交互中涉及的元素
  • 传统上,操作中涉及的对象根据它们何时参与消息序列从左到右列出。 但是,横轴上的元素可以按任何顺序出现

# 时间维度

纵轴表示页面下的时间进程(或进展)。

注意:序列图中的时间都是关于排序的,而不是持续时间。 交互图中的垂直空间与交互持续时间无关。

# 二、使用场景

时序图的使用场景非常广泛,几乎各行各业都可以使用。当然,作为一个软件工作者,我这边主要列举和软件开发有关的场景。

1.梳理业务流程

一般的软件开发都是为了支撑某个具体的业务。有时候业务的流程会比较复杂,涉及到多种角色,这时就可以使用时序图来梳理这个业务逻辑。这样会使业务看起来非常清晰,代码写起来也是水到渠成的事情了。

2.梳理开源软件

作为一个合格的程序员,阅读源代码的能力一定要过关。一般成熟框架的源代码调用深度都比较深,类之间的调用关系也比较复杂。我喜欢用时序图来梳理框架中这些对象之间的关系。比如再看 Tomcat 启动流程的过程中,我就时序图梳理了各个组件之间的关系,看起来层次非常清楚,也便于记忆。

# 三、时序图的角色

我们在画时序图时会涉及下面 10 种元素:

  • 角色(Actor)
  • 对象(Object)
  • 生命线(LifeLine)
  • 控制焦点(Activation)
  • 消息(Message)
  • 自关联消息(Self-Message)
  • 组合片段(Combined Fragments / Fragment)

UML 在 MVC 设计模式中的应用:

  • 边界(Boundary)
  • 控制(Control)
  • 实体(Entity)

其中前 6 种是比较常用和重要的元素,最后的组合片段元素不是很常用,但是比较复杂。我们先介绍前 6 种元素,再单独介绍组合片段元素、边界、控制、实体。

# 1.角色(Actor)

系统角色,可以是人或者其他系统和子系统。以一个小人图标表示。

# 2.对象(Object)

对象位于时序图的顶部,以一个矩形表示。对象的命名方式一般有三种:

  1. 对象
  • 对象名和类名。例如:华为手机:手机、loginServiceObject:LoginService;

  • 只显示类名,不显示对象,即为一个匿名类。例如::手机、:LoginSservice。

  • 只显示对象名,不显示类名。例如:华为手机:、loginServiceObject:。

2。 创建对象: 创发送者发送一个实例化消息后触发的操作。用执行消息的箭头标识,指向被创建对象的表示框

  1. 销毁对象:将对象销毁并回收其拥有的资源。在对象生命线上用 X 标识

# 3.生命线(LifeLine)

时序图中每个对象和底部中心都有一条垂直的虚线,这就是对象的生命线(对象的时间线)。以一条垂直的虚线表。

# 4.控制焦点(Focus of Control)

控制焦点又称激活,是覆盖在生命线上一段细长的矩形,表示在这个时间段内,对象或角色正处于活动状态;这有点类似于 java 语言里的大括号{}——作用域。

# 5.消息(Message)

表示对象之间发送的信息。消息分为三种类型。

  • 同步消息(Synchronous Message) 消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义。以一条实线和实心箭头表示

  • 异步消息(Asynchronous Message)

    消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。以一条实线和大于号表示

  • 返回消息(Return Message) 返回消息表示从过程调用返回。以小于号和虚线表示

# 6.自关联消息

表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。以一个半闭合的长方形+下方实心剪头表示。

下面举例一个时序图的列子,看下上面几种元素具体的使用方式。

# 7.组合片段

组合片段用来解决交互执行的条件和方式,它允许在序列图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。组合片段共有 13 种,名称及含义如下:

组合名称 组合含义
ref 引用其他地方定义的组合片段
alt 在一组行为中根据特定的条件选择某个交互 与if…then…else…对应
opt 表示一个可选的行 为 与switch对应
break 提供了和编程语言中的 break 类拟的机制
par 支持交互片段的并发执行
seq 强迫交互按照特定的顺序执行
strict 明确定义了一组交互片段的执行顺序
neg 用来标志不应该发生的交互
region 标志在组合片段中先于其他交互片断发生的交互
ignore 明确定义了交互片段不应该响应的消息
consider 明确标志了应该被处理的消息
assert 标志了在交互片段中作为事件唯一的合法继续者的操作数
loop 说明交互片段会被重复执行

# alt 样例

# loop

片段重复一定次数,可以在临界中指示片段重复的条件。Loop 相当于 for 语句。

# par

hungryPerson 传递 cookFood 消息给 oven 对象。当 oven 对象接收那个消息时,它同时发送两个消息(nukeFood 和 rotateFood)给它本身。这些消息都处理后,hungryPerson 对象从 oven 对象返回 yummyFood 。

# 四、使用 UML 建模的 MVC 框架

MVC: 设计模式

这个模型-视图-控制器可以使用刻板的 UML 表示法中的**鲁棒性(鲁棒性亦称健壮性、稳健性、强健性,是系统的健壮性)**分析来最好地进行可视化描述,这是由 Ivar Jacobson 在他的获奖著作 Object-Oriented Software Engineering 中首次提出的(参见下面的参考资料),并由 Doug Rosenberg 等人进一步解释.  在他的用例驱动的 UML 对象建模一书中。

这是一个简单的、假设的 MVC 序列图。您在上图中看到的是,Web 用户启动查询并生成事件,该事件由控制器处理以从模型中获取所需信息、验证信息并将结果集传递回视图。

# 1. UML 实体(MVC 中 的 M)

实体(模型)只不过是您的边界对象正在寻找的信息或数据。这些可能是数据库表、Excel 文件或“临时”会话或缓存数据或类似的东西

  • 描述随着时间的推移而存在并且主要关注持久状态的对象。
  • 通常来自域模型的对象
  • 我们需要跟踪和存储的东西

# 2. UML 边界(MVC 中 的 V)

捕捉用户交互、屏幕流和元素交互; 是参与者(例如,用户)在您的软件系统中与之通信的对象。这些对象可以是系统中的任何窗口、屏幕、对话框和菜单或其他用户界面。您可以在分析用例时轻松识别它们。

  • 描述系统和通信环境之间的连接。
  • 参与者在与系统通信时使用
  • 只有实体对象可以发起事件 (通常是主要的用户界面元素,例如屏幕)

# 3. UML 控制(MVC 中 的 C)

控制器)是业务对象或您的业务 Web 服务。这是您捕获用于过滤出要呈现给用户的数据的业务规则的地方,他要求什么。所以控制器实际上是在控制业务逻辑和数据转换。

  • 描述特定用例中的行为。
  • 边界对象和实体对象之间的“粘合剂”
  • 捕获业务规则和策略 (注意:通常作为其他对象的方法实现)

# 4. MVC 模型中的连接规则

考虑边界对象(Boundary)和实体(Entity)对象是名词,而控制器(Controller)是动词。

边界对象和实体对象都是名词,而控制器是动词。名词不能与其他名词对话,但动词可以与名词或动词对话

以下是连接的四个基本规则。

  • Actor 只能与边界对象交互或通信。 (用户<=>Boundary)
  • 边界对象只能与控制器和参与者通信。(Boundary<=>Controller)
  • 实体对象只能与控制器交互。(Entity<=>Controller)
  • 控制器可以与边界对象和实体对象以及其他控制器进行通信,但不能与参与者通信

# 使用 MVC 序列图开发用例场景

我们可以通过使用一组 MVC 格式的相关序列图来开发用例场景(正常或替代)。同样,MVC序列图 (opens new window)有接口对象、控制器对象和实体对象:

  • 实体是表示系统数据的对象:客户、产品、交易、购物车等。
  • 边界是与系统参与者交互的对象:UserInterface、DataBaseGateway、ServerProxy 等。
  • 控件是介于边界和实体之间的对象。

它们通过边界对象与实体交互来协调来自边界的命令的执行。控制器对象通常对应于用例场景,并且通常由序列图表示。

您可以在 MVC 序列图中为生命线使用构造型,以直观地清楚您在 MVC 中使用的对象类型,就像上面的鲁棒性分析图一样。

# 对象 和 实体/边界/控制 有什么关系

实体,边界,控制更像是对象的上一层抽象,但是最终应用都会应用在对象上。比如在 java 中使用 MVC 设计模式,其中的 M,V,C 最终都会使用到 java 的 calss 去实现。

举个例子:

# 五、draw.io 提供的图形介绍

# 六、参考

【未经作者允许禁止转载】 Last Updated: 2/4/2024, 6:06:40 AM