【UML建模】状态图(State Machine Diagram)

news2024/11/17 23:28:45

文章目录

  • 1.概述
  • 2. 状态图的使用
    • 2.1.状态图中的元素
    • 2.2.状态图的使用案例
    • 2.3.组合状态及其使用案例
  • 3.总结

1.概述

状态图,又称为状态机图,是一种用于描述对象的生命周期和状态转换的UML图示,它是一种行为图,用于描述对象的状态和状态之间的转换。这里的对象大多数情况是指的类生成的对象,但是有时候也会代表对象、参与者、用例、子系统等

通过状态图可以建立对象状态流转的统一语言,从而让项目成员可以通过更简单、更直观的理解系统的行为和交互(可以想象一下不使用状态图时,通过一大堆的文字对状态的变化进行描述,沟通会变得困难,而且还容易导致各成员对状态的理解不一致),同时,清晰的状态图有利于研发人员更好的设计和实现系统功能。

状态图通常会和活动图、时序图结合使用,以不同的视角来对这两种图示中对象状态流转的内容进行补充。

2. 状态图的使用

对于有一定开发经验的同学来说,状态图真的是非常简单的一种图例,它的画法与我们在日常开发中的思考方式是高度重合的,所以基本上一看到一个状态图,马上就可以理解它想表达的含义。

2.1.状态图中的元素

状态图中最常用的元素有4个,分别是:

  • 开始:状态开始标记,用实心圆形表示。
  • 结束:状态结束标记,用一个空心圆形中间嵌入一个实心原型表示。
  • 状态:对象在某个时间上的状态,用圆角矩形表示。
  • 转移:导致状态发生变化的事件,用实线箭线表示,箭头指向变化后的状态,在实线上用文字表示事件。

下图中分别表示有结束状态没有结束状态的两种简单状态图:
在这里插入图片描述

2.2.状态图的使用案例

以一个CRM的实际流程为例:抽象一个线索对象,通过不同的事件触发线索的状态变化:

  • 录入/导入线索:此时线索为待分配状态
  • 分配线索:线索状态为已分配且处于待跟进状态
  • 跟进线索:跟进过程中都属于跟进中状态
  • 线索无效/线索转化:线索的生命周期结束,处于跟进结束状态

将上述的文字转换成状态图,如下图所示。
在这里插入图片描述

2.3.组合状态及其使用案例

组合状态是状态图中的一种特殊状态,它是由多个简单状态和转换嵌套组成的复合状态,描述的是对象的更复杂的状态和行为。在状态图中,符合状态表示的一个大的圆角矩形框里面包含了多个小的圆角矩形框,模型如下图所示:
在这里插入图片描述


使用案例:
在Java的并发编程中有一个线程的状态转换机制,这就是一个非常经典的状态模型,里面几乎包含了状态图中所有常用的元素(包括符合状态)。

在Java中有6种,分别是NEW , RUNNABLE , WAITING , TIMED_WAITING , BLOCKED , TERMINATED ,定义在Thread.class中,其代码如下:

public enum State {
    /** 
     * 线程已创建但未启动。
     */
    NEW,
    
	/** 
     * 线程已在虚拟机中启动,等待操作系统调度后就可以运行。
     */
    RUNNABLE,
    
	/** 
     * 等待监视器锁,也就是等待进入synchronized块。
     */
    BLOCKED,
    
	/** 
     * 线程阻塞,等待其它线程将它唤醒,等待的方法包括Object.wait(),LockSupport.park()Thread.join()
     * 另外一个线程唤醒它需要使用对应的唤醒方法,Object.notify()或Object.notifyAll(),LockSupport.unPark()
     * Thread.join()会阻塞到执行join方法的线程运行结束后,才唤醒当前线程。
     */
    WAITING,

	/** 
     * 与WAITING类似,只是在Waiting的几个方法中传入等待时间的参数,没有显示的唤醒情况下,运行时间超出设置的等待时间也会唤醒。
     * 此外还有Thread.sleep(long);
     */
    TIMED_WAITING,

    /**
     * 线程执行完毕后的状态
     */
    TERMINATED;
}

其中的RUNNABLE 状态表示的是线程就绪可运行,但是线程实际是否运行,还需要操作系统为其分配CPU的时间片,所以又进一步将RUNNABLE划分成了就绪态和运行态,如下图所示:
在这里插入图片描述

3.总结

总的来说,状态图可以作为我们日常开发中处理对象的周期以及状态流转的指导,相对于其他的行为型uml图例(活动图,时序图)而言,状态图是比较简单的,可以作为前两种图例在状态这个视角上的补充。

我们在画状态图时,只需要记住4种不同的元素的含义及使用方法即可。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django 4.2发布,主要变化小结!

2023年4月,Django 4.2正式发布,此版本已被指定为长期支持 (LTS) 版本,发布3年后都会收到安全更新,将成为未来3年的主流版本。今天就来一起看看新版本有哪些变化吧? Python 兼容性 Django 4.2 支持 Python 3.8、3.9、3.…

Golang Gin 局部、全局 中间件使用

中间件 中间件是放在客户端和服务端的中间。 当你的客户端对某个接口发起一个请求,但是在到达接口2之前,这里是有一层中间件的处理。 一般常用的就是处理跨域,比如处理登入的验证token,接口返回的信息比较敏感,说白…

Sample语言上下文无关文法

<表达式>: <表达式>-<算术表达式>|<关系表达式>|<布尔表达式>|<赋值表达式> <算术表达式> <算术表达式> -> <算术表达式> <项> | <算术表达式> - <项>|<项> <项> -> <项>* …

为什么企业要做大规模敏捷?

背景 软件工程里一个重要的指标就是“可用的软件”&#xff0c;敏捷宣言里也同样告诉我们“工作的软件高于详尽的文档”&#xff0c;那“可用的软件”、“工作的软件”意味着什么呢&#xff1f;在我的理解里&#xff0c;可以经历用户 “千锤百炼”的软件就是一个“可用的软件”…

Linux 共享库 静态库 动态库

一、 静态库(后缀.a)&#xff1a;程序执行前&#xff08;编译&#xff09;就加入到目标程序中去了 优点&#xff1a;运行速度快&#xff0c;发布程序无需提供静态库&#xff0c;因为已经在编译到目标程序中&#xff0c;运行的时候可以直接运行&#xff0c;移植方便 缺点&…

【Java】Eclipse的安装和JDK的安装与配置教程

Java是能够跨越多平台的、可移植性高的一种面向对象的编程语言&#xff0c;其简单易学、功能强大&#xff0c;越来越多的程序员喜欢加入Java的阵营之中。 一、前言 Java具有以下功能特点&#xff1a; 跨平台性&#xff1a;Java程序可以在任何支持Java虚拟机&#xff08;JVM&am…

C. Increasing by Modulo(贪心 + 二分)

Problem - C - Codeforces Toad Zitz有一个整数数组&#xff0c;每个整数都在0到m-1的范围内。这些整数是a1,a2...an。 在一次操作中,,iz可以选择一个整数k和k个萦引1..k&#xff0c;使得1si i2. ..fiksn。然后他应该将每个选定的整数a刘j 更改为(aj 1lmodm)。整数m对于所有操作…

初识STL

长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西&#xff0c;以及一种得以制造出”可重复运用的东西”的方法&#xff0c;从函数(functions)&#xff0c;类别(classes),函数库(function libraries),类别库(class libraries)、各种组件&#xff0c;从模块化设计&am…

(C语言版)力扣(LeetCode)27.移除元素三种解法分析

移除元素 题目第一种解法&#xff1a;有效值前移第二种解法&#xff1a;双指针第三种解法&#xff1a;双指针优化结语 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空…

【C++】vector OJ练习

文章目录 1. 只出现一次的数字思路讲解AC代码 2. 杨辉三角思路讲解AC代码 3. 只出现一次的数字 III思路讲解AC代码 4. 只出现一次的数字 II思路讲解AC代码 5. 删除有序数组中的重复项思路讲解AC代码 6. 数组中出现次数超过一半的数字思路讲解AC代码 这篇文章我们来做几道vector…

Jenkins学习笔记

Jenkins学习笔记 1、基本概念 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2、安装 文件包&#xff1a;https://pan.…

半监督目标检测

有监督目标检测&#xff1a; 拥有大规模带标签的数据&#xff0c;包括完整的实例级别的标注&#xff0c;即包含坐标和类别信息&#xff1b;弱监督目标检测&#xff1a; 数据集中的标注仅包含类别信息&#xff0c;不包含坐标信息&#xff0c;如图一 b 所示&#xff1b;弱半监督目…

RHCE-防火墙

目录 一、防火墙介绍 1.1、什么是防火墙 1.2、防火墙的功能&#xff1a; 1.3、linux防火墙的架构 二、iptables 2.1iptables介绍 2.2名词术语&#xff1a; 什么是容器&#xff1f; 什么是Netfilter/Iptables&#xff1f; 什么是表&#xff08;tables&#xff09;&#x…

学历到底是敲门砖还是枷锁?—探讨“孔乙己文学”热搜背后的教育话题

序言 最近&#xff0c;“孔乙己文学”一度成为网络热门话题&#xff0c;引起了不少人的讨论。其中&#xff0c;一句“学历不仅是敲门砖&#xff0c;也是我下不来的高台&#xff0c;更是孔乙己脱不下的长衫”引发了广泛共鸣&#xff0c;让人深思。 敲门砖 or 枷锁&#xff1f; 对…

黑盒测试过程中【测试方法】详解4-因果图

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…

大模型竞争加剧,国内外 AI 监管进一步升级

随着人工智能技术的不断发展&#xff0c;大模型已成为当下最热门的话题之一。不仅国内外的科技公司都在积极投入研发&#xff0c;各国政府也在加大监管力度&#xff0c;以确保人工智能技术的安全和可持续发展。本文将从三个层次分别探讨大模型的定义和热度、国内外AI监管的现状…

【STM32】基础知识 第八课 MDK 工程

【STM32】基础知识 第八课 MDK 工程 准备工作新建寄存器版本 MDK 工程步骤新建工程文件夹添加文件魔术棒设置绝对路径和相对路径对比测试程序 新建 HAL 库版本 MDK 工程CMSISHAL 库简介DriversMiddlewaresDevice 和 Include HAL 库文件介绍HAL 库 API 函数和比那辆命名规则HAL …

Fedora 38 正式发布

Fedora Linux 38 正式发布&#xff0c;用户可以访问官网下载安装最新版本。 新网站 如果你点击了上面的官网链接&#xff0c;你应该会注意到 Fedora 的官网看起来与之前有了很大不同。这是 Fedora Websites & Apps 团队与 Design & Infrastructure 团队以及广大社区合作…

HCIA-RS实验-ENSP搭建一个基础的IP网络

HCIA-RS是华为认证网络工程师&#xff08;Routing & Switching&#xff09;的缩写。通过考取HCIA-RS证书&#xff0c;可以证明自己有能力设计、实现和维护小型网络。而HCIA-RS实验则是考试的一部分&#xff0c;是考生必须要完成的实践环节。这将是第一篇文章&#xff0c;后…

Qt连接MySQL数据库最详细的教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.直接通过MySQL的驱动加载数据库1&#xff09;所需代码2&#xff09;解决QMYSQL driver not loaded 2.通过ODBC连接MySQL数据库&#xff11;&#xff09;官方解释2…