10.状态机图state machine diagram
状态机图是常见的描述一个系统行为的技术。在面向对象的方法中,为单个类绘制一个状态机图来展示单个对象的生命周期行为。
图中显示控制器可处于3个状态:wait、lock和open。该图还提供规则表示状态间的改变,以转移的形式transition:连接状态的线。
转移表示从一个状态到另一个状态。每个转移有一个由三部分组成的标签:触发信号trigger-signature [守卫条件guard]/活动activity。这些部分都是可选的。触发信号经常是一单个事件event触发一个潜在的状态改变。guard如果
有的话,是一个布尔条件,必须是true这个转移才会进行。活动activity是一些在转移过程中进行的行为(behavior executed during the transition),可以是任意的行为描述behavioral expression。
如果没有触发信号,表示该转移立即进行,这经常会在活动状态activity state里见到。
在一个状态中出现一个事件时,你只能进行一个转移。如果你对同一事件进行多个转移,守卫条件必须互斥mutually exclusive。如果一个事件出现但没有转移有效,则事件被忽略。
最终状态表示状态机完成,暗示删除控制对象。记住状态机只能显示对象直接观察或激活的东西。
【内部活动】internal activities
状态可以回应事件但不转移can react to events without transitions,使用内部活动internal activity:将事件、守卫、活动放到状态盒子内部去。
上图也显示了两个特殊活动:entry或exit。entry活动是在你进入一个状态的时候执行;exit活动是在离开的时候执行。而内部活动不处罚entry或exit活动,这是内部活动和自我转移的区别。
【活动状态】
我之前描述的状态中,对象是安静的quiet并等待下个事件来做一些事情。然而,你也可让对象在某些状态里做一些不间断的ongoing工作。
do活动和一般活动都表示进行一些行为。关键的不同是一般的活动立即出现且不会被一般的事件打断。而do活动会花费有限的事件且可被打断。
uml1中用action动作表示一般的活动,而用活动actitity只表示do活动。
【超状态superstate】
你经常会发现一些状态共享相同的转移和内部活动,你可以把它们弄成子状态,并将共享的行为移到一个超状态。如下图,如果你不用子状态的话,你将为这3个状态都绘制一个cancel转移。
【并发状态concurrent state】
状态可被分成多个互补的状态图来同时进行。
【实现状态图】
可用3种方式实现:嵌套的switch、状态模式、状态表。
状态模式中创建了一个状态类的层级来处理状态的行为。图中的每个状态都有一个状态子类。控制器有对应每个事件的方法。
见图10.1
【何时用】
状态机擅长表示一个对象在几个用例中的行为,不擅长描述引入多个对象协作的行为。比如交互图(4章)擅长描述一个用例里几个对象的行为,而活动图(11章)擅长显示多个对象或用例的多个活动的时序。
状态机图是常见的描述一个系统行为的技术。在面向对象的方法中,为单个类绘制一个状态机图来展示单个对象的生命周期行为。
见图10.1
图中显示控制器可处于3个状态:wait、lock和open。该图还提供规则表示状态间的改变,以转移的形式transition:连接状态的线。
转移表示从一个状态到另一个状态。每个转移有一个由三部分组成的标签:触发信号trigger-signature [守卫条件guard]/活动activity。这些部分都是可选的。触发信号经常是一单个事件event触发一个潜在的状态改变。guard如果
有的话,是一个布尔条件,必须是true这个转移才会进行。活动activity是一些在转移过程中进行的行为(behavior executed during the transition),可以是任意的行为描述behavioral expression。
如果没有触发信号,表示该转移立即进行,这经常会在活动状态activity state里见到。
在一个状态中出现一个事件时,你只能进行一个转移。如果你对同一事件进行多个转移,守卫条件必须互斥mutually exclusive。如果一个事件出现但没有转移有效,则事件被忽略。
最终状态表示状态机完成,暗示删除控制对象。记住状态机只能显示对象直接观察或激活的东西。
【内部活动】internal activities
状态可以回应事件但不转移can react to events without transitions,使用内部活动internal activity:将事件、守卫、活动放到状态盒子内部去。
见图10.2
上图也显示了两个特殊活动:entry或exit。entry活动是在你进入一个状态的时候执行;exit活动是在离开的时候执行。而内部活动不处罚entry或exit活动,这是内部活动和自我转移的区别。
【活动状态】
我之前描述的状态中,对象是安静的quiet并等待下个事件来做一些事情。然而,你也可让对象在某些状态里做一些不间断的ongoing工作。
见图10.3
do活动和一般活动都表示进行一些行为。关键的不同是一般的活动立即出现且不会被一般的事件打断。而do活动会花费有限的事件且可被打断。
uml1中用action动作表示一般的活动,而用活动actitity只表示do活动。
【超状态superstate】
你经常会发现一些状态共享相同的转移和内部活动,你可以把它们弄成子状态,并将共享的行为移到一个超状态。如下图,如果你不用子状态的话,你将为这3个状态都绘制一个cancel转移。
见图10.4.
【并发状态concurrent state】
状态可被分成多个互补的状态图来同时进行。
见图10.5
【实现状态图】
可用3种方式实现:嵌套的switch、状态模式、状态表。
状态模式中创建了一个状态类的层级来处理状态的行为。图中的每个状态都有一个状态子类。控制器有对应每个事件的方法。
见图10.7
见图10.1
【何时用】
状态机擅长表示一个对象在几个用例中的行为,不擅长描述引入多个对象协作的行为。比如交互图(4章)擅长描述一个用例里几个对象的行为,而活动图(11章)擅长显示多个对象或用例的多个活动的时序。