Python设计模式 - UML - 状态图(State Machine Diagram)
简介
状态图主要用于描述对象在其生命周期中各种状态、状态之间的转换过程、触发状态转换的各种事件(条件)及执行的动作。
状态图构建步骤
- 找出适合用状态图描述的类、确定类中需要做状态图的重要对象
- 确定重要对象的主要状态、状态之间的转换事件、条件、动作、初次态等
- 细化状态之间的复杂转换和详细事件
- 精化复合状态、并发区域等
状态图与状态机
状态图的基础是状态机,熟悉状态图之前需要对状态机有大致的了解。
状态机是有限状态机的简称,可以用来模拟世界上的大部分事物。简单地说,状态机有三个特性、四个要素
- 工作原理:发生事件(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)的更多相关文章
- Python设计模式 - UML - 类图(Class Diagram)
简介 类图是面向对象分析和设计的核心,用来描述系统各个模块中类与类之间.接口与接口之间.类与接口之间的关系,以及每个类的属性.操作等特性,一般在详细设计过程中实施. 类图本身就是现实世界的抽象,是对系 ...
- Python设计模式 - UML - 定时图(Timing Diagram)
简介 定时图也是一种交互图,用来描述对象或实体随时间变化的状态或值,及其相应的时间或期限约束.定时图应用较广,并不局限于软件工程领域. 定时图侧重与时间线相关的值或状态的改变,这些改变可能来自于收到消 ...
- Python设计模式 - UML - 通信图(Communication Diagram)
简介 通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的. 通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送 ...
- Python设计模式 - UML - 活动图(Activity Diagram)
简介 活动图描述从一个活动到另一个活动的执行顺序.约束条件.引用对象及状态结果等方面的控制流,适用于对业务用例.工作流程或程序实现建模. 活动图建模步骤 - 确定活动图的范围和边界,对哪些工作流.哪些 ...
- Python设计模式 - UML - 时序图(Sequence Diagram)
简介 时序图表示参与者与对象之间.对象与对象之间的动态交互过程及时序关系. 时序图详细而直观地展示了对象随时间变化的状态.调用关系和消息时序,时序图中的主要元素有:参与者(Actor), 对象(Obj ...
- Python设计模式 - UML - 组件图(Component Diagram)
简介 组件图又称构建图,用于显示系统各组件及各组件关系的物理视图. 组件图通常包括组件.接口.关系.端口和连接器,用来显示程序代码中相应的模块.源文件或源文件集合之间的依赖和泛化关系. 组件图中的组件 ...
- Python设计模式 - UML - 包图(Package Diagram)
简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...
- Python设计模式 - UML - 对象图(Object Diagram)
简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...
- Python设计模式 - UML - 总览
说到设计模式就不得不涉及建模思想,说到建模思想自然而然会应用UML,目前业界开源的UML工具很多,用起来也非常便捷.近几年来随着软件应用领域开发模式转向快速迭代试错,UML在敏捷开发,尤其是web及m ...
随机推荐
- tomcat守护相关
tomcat守护相关(centos7) 今天在部署自己的服务到CentOS7服务器上tomcat中时,担心服务宕机想守护一下服务程序,于是现在网上找了一个用while写的循环守护脚本,后来发现这种方式 ...
- multipart/form-data和application/x-www-form-urlencoded区别
FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型.例如: application/x-www-form-urlencoded: 窗体数据被编码为名称/值对.这是标准的编码格 ...
- Windows下Mysql5.7忘记root密码的解决方法
找到mysql5.7安装的目录,我这里是:C:\Program Files\MySQL\MySQL Server 5.7 先停止mysql服务 在服务里找到MySQL57服务,停掉它. 修改my.in ...
- linux dd命令 创造一个文件
创造一个1G的文件 dd if=/dev/zero of=/nod/tmp/test bs=1M count=1024 创造一个1T的文件 [root@oracledg tmp]# dd if=/de ...
- android studio Authentication failed for
今天更新项目代码提示 Authentication failed for 后来一起是把git平台密码修改了 忘了修改android studio 密码所以更新失败 我在android studi ...
- 在linux上构建gitolite
每台机器生成密钥前要设置邮箱和用户名: git config --global user.name "admin" git config --global user.email & ...
- Centos7之系统优化
优化条目: 修改ip地址.网关.主机名.DNS等 关闭selinux,清空iptables 添加普通用户并进行sudo授权管理 更新yum源及必要软件安装 定时自动更新服务器时间 精简开机自启动服务 ...
- TensorFlow的介绍和安装
TensorFlow概要 由google Brain开源,设计初衷是加速机器学习的研究,2015年11月在GitHub上开源,2016年4月分布式版本,2017年发布了1.0版本,趋于稳定. Tens ...
- Python课程第一天作业
一.第一题:简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型? 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的 ...
- ubuntu下的git版本创建
一.git的特点 二.gei的安装和配置 1.安装命令如下 sudo apt-get install git 2.安装成功后输入 git 3.创建版本库 git init 4.使用 先创建一个txt文 ...