状态图

以下内容部分出至博客园coolstream,主要是自己懒得写了,部分做了修改。
官方连接

状态图(State Machine diagram)简介

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

状态图构建步骤

(1)找出适合用状态图描述的类、确定类中需要做状态图的重要对象
(2)确定重要对象的主要状态、状态之间的转换事件、条件、动作、初次态等
(3)细化状态之间的复杂转换和详细事件
(4)精化复合状态、并发区域等

状态图与状态机

状态图的基础是状态机,熟悉状态图之前需要对状态机有大致的了解。
状态机是有限状态机的简称,可以用来模拟世界上的大部分事物。简单地说,状态机有三个特性、四个要素

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

    image

  • 三个特性

    1. 有限状态机的状态(State)总数是有限的
    2. 状态机任一时刻只处于一种状态之中
    3. 在特定的条件(也称事件Event)被满足时,状态机会执行相应的动作(Action)从一种状态转换(Transition)到另一个状态
  • 四个要素

    1. 现态:当前所处状态
    2. 条件:又称为事件(Event),当一个条件被满足时就会触发一个动作,引起状态的一次转换
    3. 动作:条件满足后触发的动作
    4. 次态:满足某种条件触发了相应动作后所转换到的新状态,"次态"和"现态"的概念都是相对的,状态转移后"次态"就变成了"现态"
状态图主要元素
  • 状态(States):表示对象在其生命周期中的某个阶段、条件或状况,包括状态名、内外部转换、进入退出动作等。用圆角矩形标识

    image

    1. 内部结构:状态的内部结构可以由以下部分组成,除状态名外其他都是可选的,根据实际情况而定
        - 状态名(State Name): 状态名称
        - 进入/退出动作(Entry/Exit Action): 进入和退出动作
        - 内部转移(Internal Transition): 不会发生状态的转移
        - 内部动作(Do Action): 状态保持不变时执行的动作
        - 子状态(Submachine State): 适用于复合状态场景
        - 延迟事件(Deferred Event): 在本状态下暂时不处理,但不被丢弃,而是延迟到其他状态中处理的事件
      EA中右击status选择Features&Properties,然后选择Attributes,选择Behavior的对应栏位输入内容,栏位不可以增加只能修改
      do:当前正在做
      entry:进入时
      exity:出去时

      Behavior.PNG

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


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


      image
    4. 复合状态(Compound States):一个状态可以被嵌套在另一个状态之中,被嵌套的状态叫子状态,包含子状态的状态就称为复合状态,以两种形式出现:
        - 顺序复合状态:复合状态中的所有子状态都是互斥的不能同时存在,且在对象生命周期中的任一时刻只能处于一个子状态


      image

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


      image
    5. 历史状态(History States):复合状态场景中记住退出时的子状态,下次可以直接越过外层状态直接进入子状态
        - 浅历史状态(Shallow History State):只记住复合状态最外层的历史。用圆圈内部 H 标识


      image

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


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

    image

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

    1. UML表示法


      image
    2. 事件分类:事件按传送范围分为外部事件和内部事件,按事件源类型分为调用、变化、时间、信号、延迟事件等类型。
       - 按传送范围分
         - 外部事件:系统与外部参与者之间传送的事件
         - 内部事件:系统内部各对象之间传送的事件
       - 按事件源类型分
         - 调用事件(Call Event):对象对调用操作的接收
         - 变化事件(Change Event):依赖于指定属性值的布尔表达式条件发生改变的事件
         - 时间事件(Time Event):计算时间的表达式条件被满足的事件
         - 信号事件(Singal Event):两个对象之间进行通信的规范和载体
         - 延迟事件(Deferred Event): 在本状态下暂时不处理,但不被丢弃,而是延迟到其他状态中处理的事件
  • 转换(Transitions):状态之间在某个事件或条件驱动下的切换过程。用状态之间带文字描述的有向箭头线标识,根据外部、内部、进入、退出转换的区别而不同。

    image

    image

    image

    1. 状态转换五要素
       - 初态:转换前的状态
       - 触发事件:转换的触发条件
       - 警备条件(Guard Condition):布尔表达式,决定是否激活转换。不是所有的事件都会引起状态的转移,比如关机事件在开机状态下才会激活
       - 动作:转换激活时的操作
       - 次态:转换后的状态


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


      image
    3. 复杂转换:
       - 外部转换:对事件(Event)做出响应,执行相应的动作(Action),引起状态(State)变化。格式:事件(参数)[警备条件]/动作
       - 内部转换:对事件(Event)做出响应,执行相应的动作(Action),但并不引起状态(State)变化。格式:事件(参数)[警备条件]/动作 用单向弧形箭头标识
       - 进入转换:当进入某个状态(State)时执行某个动作(Action)。格式:entry/动作
       - 退出转换:当退出某个状态(State)时执行某个动作(Action)。格式:exit/动作

    4. EA中设置Transitions的属性


      EA transition.PNG
  • 进入节点(Entry Point):表示为空闲圆
    忽略初始化过程,直接通过一个节点进入状态或者复合状态的情况

    跳过初始化

    进入子状态图

  • 退出节点(Exit Point):表示为空闲圆带叉
    直接通过一个节点退出状态或者复合状态的情况

    exit.PNG

    image

  • 终止(Terminate): 表示为叉号
    进入终止状态是指当前状态机生命线已经终止。终止状态表示为叉号。

    image

  • 选择(Choice): 表示为菱形
    用于组合复杂的过渡路径,通过哪条Transitions路径由动态运行时条件决定(即Transitions上的条件)。

    image

  • 汇合(Junction): 表示为实心圆
    可用于将多条路径合并或合并为共享的转换路径;或者可以将传入路径拆分为多个路径。如果transition上的条件不满足(guard expression=false),将禁止通过转换。

    image

  • 并发区域(Concurrency Regions):一个复合状态中有两个或两个以上并行执行的子状态机,并发子状态机覆盖的流程称为并发区域。
    并发区域中可能没有初始状态、技术状态,其中每个子状态机还可以进一步分解为顺序组成状态。(在EA上需要两边加上fork/join竖线)

    image

    在EA上需要两边加上fork/join竖线
    image

  • 状态机(StateMachine):
    插入一个状态图,可以显示具体内容也可以不显示。
    通过右击选择New Child diagram,然后可以选择导入状态图或者显示已导入的状态图。

    stateMachine.PNG

状态图示例

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


image
状态图与活动图的区别

(1)描述对象:状态图是描述对象的状态转换,面向对象;活动图是描述执行系统中用例的具体步骤,面向过程
(2) 侧重点:状态图的重点是对象的各个状态机状态之间的转换事件、条件、动作等;活动图的重点是对象行为遵循的规则   
(3) 触发事件:状态图中的状态转换需要触发事件及满足相应的警备条件;活动图中的状态转换是自动顺序执行的,无需触发事件
(4) 对象范围:状态图中的状态转换通常只是一个对象内部的状态变迁;活动图中的状态转换可以用不同的泳道(对应于不同的对象)划分

状态图注意事项

(1)不必为类中的每个对象都创建状态图,只为那些比较复杂的、状态比较多的对象创建状态图
(2) 并不是所有的事件都会引起状态的转换,如内部转换
(3)转换在满足警备条件是才会响应事件
(4)复杂状态图可以在总状态图中隐藏子状态细节,并且单独的子状态图展示相应的细节
(5)根据实际需要适当使用复合状态、并发区域

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容