UML学习-状态图(State Diagram)

UML学习-状态图(State Diagram)状态图有些业务场景,比如电商的订单系统涉及到下单、支付、发货、退货、确认收货等业务流程。这些业务过程中最引入注目的就是状态的变化以及触发这些状态

欢迎大家来到IT世界,在知识的湖畔探索吧!

状态图

有些业务场景,比如电商的订单系统涉及到下单、支付、发货、退货、确认收货等业务流程。这些业务过程中最引入注目的就是状态的变化以及触发这些状态变化的事件、状态变化会引发的行为,因此就需要对这些状态的业务场景进行业务分析、建模、设计。状态机是对此类业务场景进行分析的有效方法。状态图是描述状态机的一种图。因此,状态机是学习状态图的基础,要先理解状态机的核心概念,然后再学习UML状态图的概念和绘制技巧。

状态机

状态机是展示状态与状态转换的图。UML用状态机对软件系统的动态特征建模。通常一个状态机依附于一个类,并且描述一个类的实例(即对象)。状态机包含了一个类的对象在其生命期间所有状态的序列以及对象对接收到的事件所产生的反应。状态机由状态转换事件活动动作5部分组成。

  1. 状态(State)表示一个模型在其生存期内的状况,如满足某些条件、执行某些操作或等待某些事件。一个状态的生存期是有限的一个时间段。
  2. 转换表示两个不同状态之间的联系,事件可以触发状态之间的转换。
  3. 事件(Event)是在某个时间产生的,可以触发状态转换的部分,如信号、对象的创建和销毁、超时和条件的改变等。在UML里面把任何事情的发生都叫做事件。事件可以是内部的,也可以是外部的。在系统和参与者之间传递交互的事件是外部事件。在系统内部之间传递的是内部事件。UML的状态图中定义了信号事件、调用事件、时间事件、变化事件这四种事件。
    1. 信号事件(Signal Event)。信号是作为两个对象之间的通信媒介的实体,发送对象明确地创建并初始化一个信号实例并把它发送到一个或一组对象,发送者不会等待接收者如何处理信号而是独立地做它自己的工作,信号。异步信号消息一般需要消息中间件的支持,如JMS、MQ等。例如,订单的状态是【待发货】,当订单系统收到一个由仓库系统发出来的订单出库的信号事件的时候,就要进行出库操作,操作的结果就是把订单的状态改成【已发货】。信号事件是异步的。
    1. 调用事件(Call Event)。调用事件指一个对象对调用的接收,通过调用事件来触发状态的改变。调用事件的处理是同步的,意味着调用方需要等到接收方确认收到调用事件,注意这个地方是指收到调用事件,而不是接收方对调用事件进行处理。例如,订单系统的下单就是一个调用事件。
    2. 时间事件(Time Event)。由事件变化触发的事件,比如订单未支付超时事件,就可以用事件时间来描述。
    3. 变化事件(Change Event)。属性的条件表达式满足条件时触发。
  4. 活动(Activity)是在状态机中进行的一个非原的的执行,由一系列动作组成。
  5. 动作(Action)是一个可执行的原子计算,它导致状态的变更或者返回一个值。

状态机不仅可以用于描述类的行为,也可以描述用例、协作和方法甚至整个系统的动态行为,所以不仅是设计阶段、在业务分析阶段、概念建模的阶段都可以用状态机来分析。

状态图

一个状态图表示一个状态机,主要用于表现从一个状态到另一个状态的控制流。它不仅可以展现一个对象拥有的状态,还可以说明事件(如消息的接收、错误、条件变更等)如何随着时间的推移来影响这些状态。状态图通常包括如下内容。

  1. 初始状态(Initial State)和结束状态(Final State)。初始状态是状态机的起始位置,是一个伪状态,它不需要事件的触发。一个状态图只能有一个初始状态。状态图总是以初始状态开始,以终止状态结束。初始状态被建模成一个实心圈。
    结束状态表示状态机执行结束或对象生命的终结,一个状态图可以有多个结束状态。最终状态被建模为一个带边界的实心圆。
UML学习-状态图(State Diagram)

初始状态

UML学习-状态图(State Diagram)

结束状态

  1. 状态是状态机的重要组成部分,它描述了状态机所在对象动态行为的执行所产生的结果。这里的结果一般是指能影响此对象对后续事件响应的结果。状态用于对对象在其生命中的状况建模,在这些状况下状态可以满足某些条件、执行某些操作或等待某些事件。图形上,使用一个圆角矩形表示一个状态。一个完整的状态有3个组成部分。

a. 名字(name)状态的名字由一个字符串构成,用以识别不同的状态。状态可以是匿名的,即没有名字。状态名一般放置在状态图符的顶部。

b. 状态行为。UML定义了3种状态行为,分别是进入活动(Entry Activity)、退出活动(Exit Activity)、活动(Do Activity),这些活动可以是对象内部的一个或一组动作,也可以是向外发送一个信号。

      1. 进入活动:系统要进入该状态时要发生的动作,不可中断。
      2. 退出活动:系统离开这个状态时要发生的动作,不可中断。
      3. 活动:系统处在这个状态时要发生的活动,可中断,当系统处在这个状态时运行完毕,也可以在对象转入另一个状态时中断。

c. 子状态(Substate)在复杂的应用中,当状态机处于某特定的状态时,状态机所在的对象在此刻的行为还可以用一个状态机来描述,也就是说,一个状态内部还包括其他状态。在UML里,子状态被定义成状态的嵌套结构,即包含在某状态内部的状态。在UML里,包含子状态的状态被称为复合状态(CompositeState),不包含子状态的状态被称为简单状态(SimpleState)。子状态以两种形式出现:顺序子状态和并发子状态。

      1. 顺序子状态:如果一个复合状态的子状态对应的对象在其生命期内任何时刻都只能处于一个子状态,即不会有多个子状态同时发生的情况,这个子状态被称为顺序子状态。当状态机通过转换从某状态转入复合状态时,此转换的目的可能是这个复合状态本身,也可能是复合状态的子状态。如果是前者,状态机所指的对象首先执行复合状态的入口动作,然后子状态进入初始状态并以此为起点开始运行。如果此转换的目的是复合状态的子状态,复合状态的入口动作首先被执行,然后复合状态的内嵌状态机以此转换的目标子状态为起点开始运行。以CD播放器为例,播放器的运行状态包含了Playing和Pausing两个子状态,这两个状态是顺序的,不可能存在同时发生的状态。
UML学习-状态图(State Diagram)

顺序子状态

      1. 并发子状态(ConcurrentSubstate)如果复合状态内部只有顺序子状态,那么这个复合状态机只有一个内嵌状态机。但有时可能需要在复合状态中有两个或多个并发执行的子状态机。这时,称复合状态的子状态为并发子状态。顺序子状态与并发子状态的区别在于后者在同一层次给出两个或多个顺序子状态,对象处于同一层次中来自每个并发子状态的一个时序状态中。当一个转换所到的组合状态被分解成多个并发子状态组合时,控制就分成与并发子状态对应的控制流。在两种情况下控制流会汇合成一个:第一,当一个复合状态转出的转移被激发时,所有的内嵌状态机的运行被打断,控制流会汇合成一个,对象的状态从复合状态转出;第二,每个内嵌状态机都运行到终止状态。这时,所有的内嵌状态机的运行被打断,但对象还处于复合状态。
UML学习-状态图(State Diagram)

d. 跟子状态相关的还有历史状态(History State)这个概念。历史状态进一步分为浅历史状态(Shallow History State)和深历史状态(Deep History State)。浅(shallow)历史状态, 只记住最外层组合状态的历史。深(deep)历史状态, 可以记住任意深度的组合状态的历史。举例,CD Player,running状态被打断到power on状态,再转回到running状态时,希望直接进入历史状态

UML学习-状态图(State Diagram)

  1. 转换(Transition)。状态图通过对对象的状态以及状态间的转换建模来展现系统动态行为。转换是状态间的关联。它们用于对一个实体的不同状态间的关系建模。当某实体在第一个状态中执行一定的动作,并在某个特定事情发生并且某个特定的条件满足时进入下一个状态。在UML里,转换由5个部分组成,它们分别是:源状态、目标状态、触发事件、监护条件和动作。
    1. 源状态(Source State)转换描述的是状态机所在的对象的状态的变化(状态图是可视化状态机的一种方式)。转换使对象从某个状态转换到另一个状态。那么在转换被激发之前,对象所处的状态就是转换的源状态。源状态就是被转换影响的状态。某对象处于源状态,当它接收到触发事件或满足监护条件,就会激活一个转换。一个转换可以有多个源状态,这表示状态机所在对象中的多个控制流在转换发生时汇合成一个控制流。在UML中,多源状态的转换通常使用活动图表示。
    2. 目标状态(Target State)转换使对象从一个状态转换到另一个状态。转换完成后,对象状态发生了变化,这时对象所处的状态就是转换的目标状态。目标是转换完成后活动的状态。在图形上,转换的源状态位于表示转换的箭头的起始位置。转换的目标状态位于表示转换的箭头所指的那个状态。在这里要特别注意把源状态、目标状态的概念与状态图的初始状态、终止状态的概念区别开来。同样,一个转换可以有多个目标状态,这表示状态机所在的对象在转换被激活的时刻一个控制流分解为多个控制流。在UML中,多目标状态的转换通常使用活动图表示。
    3. 触发事件(Trigger Event)状态机描述了对象的具有事件驱动的动态行为。在这些动态行为中,对象动作的执行、状态的改变都是以特定事件的发生为前提的。转换的触发事件就是引起转变的事件。这里所指的事件可以是信号、调用、时间段或状态的一个改变。一个信号或调用可以带有参数,参数值可以由监护条件和动作的表达式的转换得到。在UML中还可能有无触发转换,它不需要事件触发,一般当它的源状态已经完成它的活动时,无触发转换为被触发。
    4. 监护条件(Guard Condition)转换可能具有一个监护条件。监护条件是一个方括号括起来的布尔表达式,它被放在触发事件的后面。监护条件可以引用对象的属性值和触发事件的参数。当一个触发事件被触发时,布尔表达式被赋值。如果值是“真”,则触发事件使转换有效。如果值是“假”,则不会引起转换。监护条件只在引起转换的触发事件发生时被赋值一次,如果此转换被重新触发,监护条件会被重新赋值。
    5. 动作(Action)当转变被激活时,它对应的动作被执行。动作是一个可执行的原子计算,它可以包括操作调用、另一个对象的创建或撤销、向一个对象发送信号。动作也可以是一个动作序列,即包括一序列的简单动作。动作或动作序列的执行执行不会被同时发生的其他动作所影响。
UML学习-状态图(State Diagram)

状态图的其他元素

  • 选择(Choice):根据保护条件的取值而发生分支,用空心小菱形表示。例如下图中,基于订单是买家直接付款还是货到付款引导到不同的订单状态。
UML学习-状态图(State Diagram)

  • 连接(Junction):经过“选择”以后,系统就出现了多条路径,后续这些路径可能又需要回到相同的流程上来,并依据汇聚“连接”的条件和状态,进行新的状态选择。例如,下图,如果不借助“连接”这个点,就需要在每个状态后面重复条件C的选择逻辑,整个状态图就变动很复杂。
UML学习-状态图(State Diagram)

  • 分叉(fork)和汇合(join):分叉是一个源状态分为两个或两个以上的目标状态。汇合是两个以上的源状态连接成一个目标状态。举例,员工的离职流程,在主管同意离职以后,状态进行分叉,一个是工作交接的完成状态,另外一个是资产归还的状态,只有这两个状态都完成以后,又汇合到“待人事办理”这个目标状态。
UML学习-状态图(State Diagram)

  • 进入点(Entry Point)。有些状态图或者子状态图可能没有初始化状态,直接进入某种状态的情况,就通过“进入点”来定义。下图中的错误处理,无需初始化,就进入相应的状态。
UML学习-状态图(State Diagram)

  • 退出点(Exit Point) 退出点用来表示离开组合状态。退出点不是状态转换的终结,只是表示退出子状态,进行下一轮。例如,下图“处理”子状态中状态B的proceed事件或者状态A的error_1事件都表示“处理”状态要退出了,但整个流程是没有结束的。而“错误处理”状态中,无论是“处理成功”还是“处理失败”都表示整个状态机结束,所以“错误处理”子状态中用的是“结束状态”。

UML学习-状态图(State Diagram)

  • 结束(Terminate):结束指的是状态机遇到了一些特殊情况,状态机被立即终止了,也没有机会执行任何的exit行为,例如手机电源没点了,进程被杀死了。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/49510.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信