简介

状态图主要用于描述对象在其生命周期中各种状态、状态之间的转换过程、触发状态转换的各种事件(条件)及执行的动作。

状态图构建步骤

    - 找出适合用状态图描述的类、确定类中需要做状态图的重要对象

    - 确定重要对象的主要状态、状态之间的转换事件、条件、动作、初次态等

    - 细化状态之间的复杂转换和详细事件

    - 精化复合状态、并发区域等

状态图与状态机

状态图的基础是状态机,熟悉状态图之前需要对状态机有大致的了解。

状态机是有限状态机的简称,可以用来模拟世界上的大部分事物。简单地说,状态机有三个特性、四个要素

  • 工作原理:发生事件(Event)后,根据当前状态(Current State)决定执行的动作(Action),并设置下一个状态(Next State)。以进程调度为例:

    

  • 三个特性

      - 有限状态机的状态(State)总数是有限的

      - 状态机任一时刻只处于一种状态之中

      - 在特定的条件(也称事件Event)被满足时,状态机会执行相应的动作(Action)从一种状态转换(Transition)到另一个状态

  • 四个要素

      - 现态:当前所处状态

      - 条件:又称为事件(Event),当一个条件被满足时就会触发一个动作,引起状态的一次转换

      - 动作:条件满足后触发的动作

      - 次态:满足某种条件触发了相应动作后所转换到的新状态,"次态"和"现态"的概念都是相对的,状态转移后"次态"就变成了"现态"

状态图主要元素

  • 状态(States):表示对象在其生命周期中的某个阶段、条件或状况,包括状态名、内外部转换、进入退出动作等。用圆角矩形标识

      

    - 内部结构:状态的内部结构可以由以下部分组成,除状态名外其他都是可选的,根据实际情况而定

            - 状态名(State Name): 状态名称

         - 进入/退出动作(Entry/Exit Action): 进入和退出动作

         - 内部转移(Internal Transition): 不会发生状态的转移

         - 内部动作(Do Action): 状态保持不变时执行的动作

         - 子状态(Submachine State): 适用于复合状态场景

         - 延迟事件(Deferred Event): 在本状态下暂时不处理,但不被丢弃,而是延迟到其他状态中处理的事件

    - 初始状态(Initial States):用实心圆点标识

      

    - 结束状态(Final States):用圆形内嵌圆点标识,一个状态图可以由多个结束状态。

      

    - 复合状态(Compound States):一个状态可以被嵌套在另一个状态之中,被嵌套的状态叫子状态,包含子状态的状态就称为复合状态,以两种形式出现:

          - 顺序复合状态:复合状态中的所有子状态都是互斥的不能同时存在,且在对象生命周期中的任一时刻只能处于一个子状态

          

          - 并发复合状态:复合状态中有两个或多个可以并发执行的子状态

            

    - 历史状态(History States):复合状态场景中记住退出时的子状态,下次可以直接越过外层状态直接进入子状态

          - 浅历史状态(Shallow History State):只记住复合状态最外层的历史。用标识

            

            

          - 深历史状态(Deep History State):记住复合状态所有层次子状态的历史。用标识

             

  • 动作(Actions):可执行的原子级操作。用正斜杠后间隔的文字标识

  • 事件(Event):事件可以分成调用事件、变化事件、时间事件和信号事件等

      

    - UML表示法

      

    - 事件分类:事件按传送范围分为外部事件和内部事件,按事件源类型分为调用、变化、时间、信号、延迟事件等类型。

         - 按传送范围分

            - 外部事件:系统与外部参与者之间传送的事件

            - 内部事件:系统内部各对象之间传送的事件

         - 按事件源类型分

            - 调用事件(Call Event):对象对调用操作的接收

            - 变化事件(Change Event):依赖于指定属性值的布尔表达式条件发生改变的事件

            - 时间事件(Time Event):计算时间的表达式条件被满足的事件

            - 信号事件(Singal Event):两个对象之间进行通信的规范和载体

            - 延迟事件(Deferred Event): 在本状态下暂时不处理,但不被丢弃,而是延迟到其他状态中处理的事件

  • 转换(Transitions):状态之间在某个事件或条件驱动下的切换过程。用状态之间带文字描述的有向箭头线标识,根据外部、内部、进入、退出转换的区别而不同。

     

      - 状态转换五要素

          - 初态:转换前的状态

          - 触发事件:转换的触发条件

          - 警备条件(Guard Condition):布尔表达式,决定是否激活转换。不是所有的事件都会引起状态的转移,比如关机事件在开机状态下才会激活

          - 动作:转换激活时的操作

          - 次态:转换后的状态

        

      - 自身转移(Self-Transitions):状态有返回自身状态的转移

        

      - 复杂转换:

          - 外部转换:对事件(Event)做出响应,执行相应的动作(Action),引起状态(State)变化。格式:事件(参数)[警备条件]/动作

          - 内部转换:对事件(Event)做出响应,执行相应的动作(Action),但并不引起状态(State)变化。格式:事件(参数)[警备条件]/动作

               用单向弧形箭头标识

          - 进入转换:当进入某个状态(State)时执行某个动作(Action)。格式:entry/动作

          - 退出转换:当退出某个状态(State)时执行某个动作(Action)。格式:exit/动作

  • 进入节点(Enter Point):忽略初始化过程,直接通过一个节点进入状态的情况

    

  • 退出节点(Exit Point):直接通过一个节点退出状态的情况

    

  • 并发区域(Concurrency Regions):一个复合状态中有两个或两个以上并行执行的子状态机,并发子状态机覆盖的流程称为并发区域。

   并发区域中可能没有初始状态、技术状态,其中每个子状态机还可以进一步分解为顺序组成状态。

    

状态图示例

以线程调度及状态转换为例

状态图与活动图的区别

     - 描述对象:状态图是描述对象的状态转换,面向对象;活动图是描述执行系统中用例的具体步骤,面向过程

     - 侧重点:状态图的重点是对象的各个状态机状态之间的转换事件、条件、动作等;活动图的重点是对象行为遵循的规则   

     - 触发事件:状态图中的状态转换需要触发事件及满足相应的警备条件;活动图中的状态转换是自动顺序执行的,无需触发事件

     - 对象范围:状态图中的状态转换通常只是一个对象内部的状态变迁;活动图中的状态转换可以用不同的泳道(对应于不同的对象)划分

状态图注意事项

    

    - 不必为类中的每个对象都创建状态图,只为那些比较复杂的、状态比较多的对象创建状态图

    - 并不是所有的事件都会引起状态的转换,如内部转换

    - 转换在满足警备条件是才会响应事件

    - 复杂状态图可以在总状态图中隐藏子状态细节,并且单独的子状态图展示相应的细节

    - 根据实际需要适当使用复合状态、并发区域

Python设计模式 - UML - 状态图(State Machine Diagram)的更多相关文章

  1. Python设计模式 - UML - 类图(Class Diagram)

    简介 类图是面向对象分析和设计的核心,用来描述系统各个模块中类与类之间.接口与接口之间.类与接口之间的关系,以及每个类的属性.操作等特性,一般在详细设计过程中实施. 类图本身就是现实世界的抽象,是对系 ...

  2. Python设计模式 - UML - 定时图(Timing Diagram)

    简介 定时图也是一种交互图,用来描述对象或实体随时间变化的状态或值,及其相应的时间或期限约束.定时图应用较广,并不局限于软件工程领域. 定时图侧重与时间线相关的值或状态的改变,这些改变可能来自于收到消 ...

  3. Python设计模式 - UML - 通信图(Communication Diagram)

    简介 通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的. 通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送 ...

  4. Python设计模式 - UML - 活动图(Activity Diagram)

    简介 活动图描述从一个活动到另一个活动的执行顺序.约束条件.引用对象及状态结果等方面的控制流,适用于对业务用例.工作流程或程序实现建模. 活动图建模步骤 - 确定活动图的范围和边界,对哪些工作流.哪些 ...

  5. Python设计模式 - UML - 时序图(Sequence Diagram)

    简介 时序图表示参与者与对象之间.对象与对象之间的动态交互过程及时序关系. 时序图详细而直观地展示了对象随时间变化的状态.调用关系和消息时序,时序图中的主要元素有:参与者(Actor), 对象(Obj ...

  6. Python设计模式 - UML - 组件图(Component Diagram)

    简介 组件图又称构建图,用于显示系统各组件及各组件关系的物理视图. 组件图通常包括组件.接口.关系.端口和连接器,用来显示程序代码中相应的模块.源文件或源文件集合之间的依赖和泛化关系. 组件图中的组件 ...

  7. Python设计模式 - UML - 包图(Package Diagram)

    简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...

  8. Python设计模式 - UML - 对象图(Object Diagram)

    简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...

  9. Python设计模式 - UML - 总览

    说到设计模式就不得不涉及建模思想,说到建模思想自然而然会应用UML,目前业界开源的UML工具很多,用起来也非常便捷.近几年来随着软件应用领域开发模式转向快速迭代试错,UML在敏捷开发,尤其是web及m ...

随机推荐

  1. 测试开发学习进阶教程 视频&PDF

    测试开发学习进阶教程 视频&PDF,7天后失效,更多学习资料加Q群 https://pan.baidu.com/s/196KEo791NeZKyfV_E-36Uw 提取码: 41vu     ...

  2. PHP 概览

    运行环境 Windows Linux  Centos Ubuntu MacOS 编辑器 编码风格 依赖管理 Composer 发布包 热门框架 热门类库 热门系统 架构支持 源码分析 扩展开发

  3. 1、redis 基础

    1.1 导言 如果你从来没使用过 Redis 数据库,那你肯定会问,为什么我们要学 Redis数据库,我只使用 MySQL 或 Oracle 就够了.其实 Redis 虽叫数据库,可又不是传统意义上的 ...

  4. 安装部署Kafka集群

    kafka是一个开源的分布式消息订阅系统(消息中间件) 安装过程 1.下载kafka_2.11-0.10.1.0.gz(ps:千万不要下错了,博主就是下到了src文件上去了,kafka中的zookee ...

  5. 决策树(decision tree)

    决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...

  6. 一台机器部署多个tomcat服务 nginx反向代理多个服务 笔记

    安装tomcat步骤           1. 下载apache-tomcat-8.0.30 ,下载下来的文件为apache-tomcat-8.0.30-windows-x64.zip         ...

  7. 4DAY权限管理-2018-04-27

    0xff001 基本权限UGO 1.描述 ​ 文件权限设置,可以赋予莫个用户或组能够以何种方式 访问某个文件 2.权限对象U\G\O(属主\属组\其他人) 例如:[root@localhost ~]# ...

  8. MPICH2简单的安装配置总结

    ./configure -prefix=/home/mpi/mpich2 make make install 用命令export PATH /home/mpi/mpich2/bin:$PATH,但我是 ...

  9. Kafka connect in practice(3): distributed mode mysql binlog ->kafka->hive

    In the previous post Kafka connect in practice(1): standalone, I have introduced about the basics of ...

  10. WordPress版微信小程序3.5版发布

    最近花时间对WordPress版微信小程序做了一些完善和调整,修复不少程序的问题.一个程序的完善是持续和渐进的,没有最好,只有更完善.虽然会采纳一些用户的建议和意见,但我会从一个产品角度去考虑,哪些功 ...