状态机图(Statechart Diagram)

一、定义

状态机图是一种动态图 。描述一个特定对象的所有可能的状态以及引起状态转换的事件。

二、构成

状态机由状态、转移、事件和动作等组成。

1、状态

状态(state)是指对象在其生命周期中,满足某些条件、执行某些活动或等待某些事件时的一个状况

如图书馆的一本书籍可能有:“在架”、“借出”、“被预借”等状态。

(1)标准状态

在UML中,状态使用圆角矩形表示,一个状态有自己的状态名称,状态中包含该状态下将执行的动作事件

image.png

  • entry为进入状态时的动作,当进入该状态时要执行的动作;
  • do为处于该状态下执行的动作。
  • exit为退出动作,当离开当前状态时要执行的动作。
  • event为在该状态下定义相应的事件动作。
(2) 初始状态

初始状态代表状态机图的开始,使用实心圆表示。一个状态机图只有一个初始状态。

(3)结束状态

结束状态表示一个状态机图的结束,使用实心的圆环表示。一个状态机图可以有多个结束状态。
image.png

(4)组合状态

组合状态是状态内部嵌套有子状态的状态。一个组合状态包含一系列子状态。
而没有嵌套的状态称之为简单状态。

(5)子状态

嵌套在一个状态内部的状态为子状态。可以根据状态是否同时存在,可以再细分为顺序子状态和并发子状态。

顺序子状态 :在组合状态的生命周期中,任何时刻只能处于一个子状态,即多个子状态之间是互斥的关系,不能同时存在。
image.png
并发子状态 :多个顺序的子状态可以同时存在。
image.png

(6)历史状态

历史状态是一种伪状态,它表示在状态再次转移到该组合状态时,应处于上一次退出时的一个子状态。
一个音乐播放器的一个状态机图。其中“播放”标记为历史状态。其含义是在播放状态转移到暂停状态,当由暂停再进入播放状态时,其应进入“播放”状态退出时的一个子状态,它可能在退出时是“顺序播放”状态,也可能是“随机播放”状态,也可能是“倒序播放”状态,但必须是退出“播放”状态时所处的一个历史状态。

image.png

2、转移

转移(Transition)指的是两个不同状态之间的一种关系,是对象在满足一定条件或发生某个事件时,从一种状态迁移到另外一种状态。

(1)转移五要素 :
  1. 源状态:即受转换影响的状态。
  2. 目标状态:当转换完成后对象的状态
  3. 触发事件:当源状态的对象接收到事件时转移才有可能被激活。触发事件有自己的名称,也可以有自己的参数。
  4. 监护条件:布尔表达式,决定是否激活转换
  5. 动作:转换激活时的操作

image.png

(2)转移分类:
分类说明
外部转移是一种改变状态的转移,是状态机中常见的一种转移。主要出现在两个不同的状态之间。
内部转移是指不会导致状态改变的转换。有时,我们需要在该状态下处理一些无需离开状态的事件,这时可以定义一个内部转移。如“借阅图书”这个状态中event。image.png
自转移如果源状态与目的状态是同一状态,image.png

3、事件

事件(Event)是指在特定时间或空间内出现,并能够导致状态转移的信号、超时、条件改变、时间段等。
主要包括信号事件、时间事件、改变事件和调用事件等。

(1)信号事件

信号事件(signal event)是指一个对象接收到信号的事件,该接收信号的事件会导致其状态的转换。
image.png

(2)时间事件

时间事件(time event)代表时间的流逝。当时间条件被满足时可能要触发某个事件。时间可以是相对的也可以绝对的。如:after(9:00)。
image.png

(3)改变事件

改变事件(change event)是指依赖特定属性值的逻辑表达式所表示的条件满足时,事件发生。
image.png

(4)调用事件

调用事件(call event)表示一个对象接收到一个对调用的请求,这个对象用状态的转移而非特定的处理过程来实现操作。操作的参数即是事件的参数。调用结束时,被调用者将返回结果给调用者,调用者可以继续执行。
image.png

4、动作

动作通常是一个简短的计算处理过程,如赋值操作或算术运算。动作也可以是一个动作序列,包括给另外一个对象发送消息、调用一个操作、设置返回值、创建或销毁对象。
动作具有原子性。

三、示例

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458009.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】Linux使用git自动备份和使用支持文件恢复的rm命令

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 首先非常不幸地告诉你:Linux 系统的标准 rm 命令不支持文件恢复功能。一旦使用 rm 删除了文件或目录,它们就会从文件系统中永久删除,除非你使用专门的文件恢复工具尝试…

无人机在化工消防救援中的应用,消防无人机应用场景分析

火灾对社会环境具有较大影响,因此需要重视消防灭火救援工作,注重现代化技术的运用,将无人机应用到救援过程并保障其应用质量。无人机是一项重要技术,便于消防灭火救援操作,使救援过程灵活展开,排除不利影响…

01动力云客之环境准备+前端Vite搭建VUE项目入门+引入Element PLUS

1. 技术选型 前端:Html、CSS、JavaScript、Vue、Axios、Element Plus 后端:Spring Boot、Spring Security、MyBatis、MySQL、Redis 相关组件:HiKariCP(Spring Boot默认数据库连接池)、Spring-Data-Redis(S…

ubuntu 安装 kvmQemu no active connection to install on

更新 apt sudo apt update检查虚拟化是否开启 0 不开,其余数字表示开启,开不开都可以,不开性能弱,只能跑 x86 系统 egrep -c (vmx|svm) /proc/cpuinfo安装 sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virt…

年货大数据(年货节数据/电商行业数据):龙年再添两个黑马食品饮料品类,增长11倍!

年货零食三大件:牛奶、糖果和炒货。今年再多两大件,礼品卡券和腊味。 根据鲸参谋数据显示,今年坚果炒货、糖果、牛奶乳品、饮料等品类依然是长期的年货热门品类。1月前三周,牛奶乳品销量环比增长68%,销售额环比增长55…

Yearning审核平台本地安装配置并结合内网穿透实现远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…

Ubuntu22.04切换系统cuda版本

由于最近项目要求的cuda版本有差异,而在Ubuntu中可以通过切换cuda来满足需求,现记录如下。 1、按照 Ubuntu22.04与深度学习配置 中的cuda安装章节,将需要的cuda版本下载到本地并进行安装。 2、cuda安装完成后修改bashrc文件内容 sudo gedit …

​​​​​​​CleanMyMac X有什么优势?到底好不好用?

当你的Mac开始变得缓慢或者存储空间告急时,这通常是一个清理磁盘空间的信号。无论是工作文件、个人照片、还是各种应用程序,随着时间的推移,它们都可能在你的硬盘上积累了大量数据。有效地管理这些文件不仅可以提高你的工作效率,还…

在 Docker 中启动 ROS2 里的 rivz2 和 rqt 出现错误的解决方法

1. 出现错误: 运行 ros2 run rivz2 rivz2 ,报错如下 : No protocol specified qt.qpa.xcb: could not connect to display :1 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was f…

Deepin系统安装x11vnc远程桌面工具实现无公网ip访问本地桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具,它的原理是通过X Window系统的协议来实现远程桌面的展…

形态学操作之开操作与闭操作的python实现——数字图像处理

原理 图像处理中的开操作(Opening)和闭操作(Closing)是形态学(Morphological)操作的两个基本类型,它们都是基于膨胀(Dilation)和腐蚀(Erosion)操…

ideal打包,如何访问项目根目录的libs中的jar包

参考&#xff1a;idea maven 导入lib中jar 并打包_maven引入lib中的jar包-CSDN博客 解决办法&#xff0c;只需要在pom文件中加入 <includeSystemScope>true</includeSystemScope> <build><!-- <includeSystemScope>true</includeSystemScope&g…