课件

11.5 状态图.pdf

状态图

状态图 State Chart/State Machine Diagram
在 UML 中状态图用来表示一个类的全生命周期过程。在系统中,类最主要的动态行为就是对它门自身的状态进行检查和管理,状态图关注的就是一个类对象全生命周期的状态切换,每一个状态都是对象所能处在的一个上下文条件。

image.png
上图的状态机它为这个类定义子 5 个状态,包括对象创建意识时所处的开始状态、以及对象徹销时所处的结束状态,一般来说对象有且只有一个起始状态,但是可以没有或者有多个结束状态。对象的迁移描述的是对象如何从一个状态进入另外一个状态,迁移的发生可以由事件触发,也可以是在迁移的过程中执行某些操作。比如在课程的讲授过程中有学生中途退课,当退课的学生人数导致课程注册人数下降为零的时候,课程就结束了。学生人数的监控是通过一个卫士的条件来完成的,在状态的内部对象也可以执行一系列的活动,活动的开始进入该状态,活动完成时退出该状态,这个时候状态图也可以演化为一个活动图,状态图关注的活动核心行为是迁移的效果、状态的出入条件和动作以及状态持续期间的条件和动作。

状态图建模

image.png
状态图的建模元素包括:

  • 状态
  • 事件
  • 状态转移
  • 特殊状态
    • 初始状态、结束状态
    • 组合状态、嵌套状态
    • 历史状态

状态

状态的定义为一个对象生命期的一个阶段,该阶段中对象要满足一些特定的条件、执行特定的话动或等待某个(些)事件的发生。它的具体体现为对象属性的取值,包含状态入口或出口行为的描述。它从不同的抽象层次分析对象,因此其状态是可嵌套、组合的。针对给定的场景,对象的状态是确定的,也就是说可满足或不满足某个状态。

事件

事件在状态的迁移过程中有重要的作用。事件的定义为可以触发对象状态改变的那些外部刺激,在面向对象的上下文里也就是对象消息的发出与接收。它决定状态迁移何时发生。

状态迁移

状态迁移是对象状态之间的一种动态关系,当一个触发事件发生或者迁移条件满足时,就会发生从源状态(Source State)到目标状态(Object State)的一次转变。由此可见:

  • 状态迁移的发生要求:当且仅当迁移条件满足的时候才会触发
  • 每一个状态迁移都伴随着一个触发事件
  • 同时还需要满足一定的警戒条件(Guard Condition)
  • 当触发事件发生,或相关警戒条件满足时,进行相应的状态迁移
  • 状态迁移的过程会伴随相关的对象操作

UML 状态图中的状态(State)

在 UML 状态图中的状态定义为在某个时间段内:

  • 某条陈述是正确的:一般来说这个陈述是关于对象属性取值的一个表达式,例如 (budget - expenses) > 0,表示当前的项目它处在预算还是有结余的状况。
  • 某个动作正在执行以及在某个时间等待触发:比如检查订单商品的存活这个动作等在执行,或者等待缺货的产品到货,这些都是一个状态的定义。

一个状态的相关的活动类型:

  • do/activity:状态持续期内的活动,意思就是当对象处于这个状态的时候这个活动就会一直执行,直到离开这个状态;
  • entry/action and exit/action:入口动作或者出口动作是指进入或者离开这个状态时,需要执行的一次性的动作;
  • include/stateDiagramName:包含子图这样的关系指在当前的状态下会转到另一个完整的状态图,形成分层次的状态图,也就是嵌套关系;

状态定义例子:
image.pngimage.png

UML 状态图中的迁移(Transitions)

UML 状态图中迁移的定义包括五部分的内容:

  • 源状态(source state)
  • 触发事件(event trigger)
  • 警戒条件(guard condition)
  • 动作(action)
  • 目标状态(target state)

image.png
中间迁移线上的标注按触发事件、警戒条件和动作的顺序排列,源状态、目标状态分别处于迁移线的左侧和右侧。

对于给定的状态,最终只能产生一个迁移,这样才是一个确定行为的状态机,因此从相同的状态出来的、 事件相同的几个迁移之间的条件应该是互斥的。即迁移条件不能存在重叠或遗漏的情况。
image.png

UML 状态图中的事件(Event)

UML 状态图中对事件的定义的意义在于它帮助系统了解正在发生什么事情。状态图中事件仅需和系统或当前建模的对象相关。它从系统的角度出发,事件必须建模成一个瞬间可以完成的原子动作,比如完成工作、考试未通过、系统崩溃等等。在面向对象设计中通过传递消息来实现事件。

UML 中有四种典型的事件:

  • 变更事件(Change events) ,当给定条件成立时发生状态的变化
  • 调用事件(Call events) ,向给定的对象发出调用某个操作或者执行某个命令的事件
  • 时间事件(Elapsed-time events) ,表明时间段过去或某个特殊时间点的触发
  • 信号事件(Signal events) ,当给定对象收到某实时信号的处理要求

变更事件

变更事件通过布尔表达式中变量的改变来表达,也就是说通过改变变量的值,来使得事件触发。用“when”关键字进行提示。

这种事件的表达往往就是一个条件表达式,比如当温度大于 120 度的时候要报警:
image.png

变更事件和警戒条件的区别在于,警戒条件只是在所相关的事件所出现时计算一次,而变更事件则是要监控、反复监控、持续监控。

调用事件

调用事件是指当前对象的状态迁移时,会发出一个动作调用其它对象的方法。

语法格式如下:事件名 ([逗号分隔的参数列表]) ,其中参数列表中的参数格式为:参数名:类型
image.png
↑从手工状态转成自动状态的时候要发出调用自动导航功能这样一个事件

时间事件

时间事件是通过时间表达式是否满足来表示事件,它可以表示一个绝对时间点的到来,也就是时刻或者经过一个时间段之后对象进入了一个新的状态等等。

用关键字after或when表示,
image.png
↑经过 2 秒钟就从活动状态进入空闲态,然后在这个迁移发生的时候要把电话的连接破坏掉,从第二个活动态进入空闲态是指当 2000 年的 1 月 1 日到来的时候,要进入空闲态。

信号事件

信号事件是由一个对象异步的发送,并由另一个对象接收的命名对象。它可能引起对象的状态迁移,表达对象之间的异步通信关系和行为。

语法格式如下:事件名 ( [逗号分隔的参数列表] )
image.png
信号事件和调用事件的区别在于,信号是一个异步的事件,而调用则是一个同步的事件。

UML 状态图中的动作(Action)

UML 状态图中动作定义为在对象状态内部或者状态间迁移时所执行的原子操作。

两个特殊的动作分别是:入口动作(entry action)和出口动作(exit action)。在动作定义表达式中可以引用当前对象的属性或者在输入事件中所获得的参数。从状态抽象的角度来讲,动作是具有原子性、及时性,不可中断,它的执行时间可以忽略不计。

需要注意的一点是:

  • 动作是由当前的对象向外发出的消息,因此它一定是由外部的对象提供某种服务。
  • 而当前对象所接收到的事件是来自外部对象的调用或者服务请求,因此它一定是当前对象对外提供的操作