状态机和状态机图_第1页
状态机和状态机图_第2页
状态机和状态机图_第3页
状态机和状态机图_第4页
状态机和状态机图_第5页
已阅读5页,还剩56页未读 继续免费阅读

状态机和状态机图.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 1 第十六章第十六章 状态机和状态机图状态机和状态机图 1、引言、引言 在软件系统中有这样一类对象,它们 一方面需要处理各种随机发生的事件序列 通过相应的动态行为产生对事件的响应 另一方面,其特定时刻的动态行为 取决于此对象在早些时刻的行为的结果。 2 例如,当软件系统的用户界面处理程序 在和用户交互时,就是这种情形。 如果用户界面是基于命令行的,那么, 合法的命令必须满足特定的语法, 命令行处理程序里的语法分析程序的任务 分析从键盘传入的字符流, 从中提取出合法的命令的语法成分 区分命令行的命令部分和命令参数部分, 以决定进行何种操作。 因此, 对于字符流里的同样的子序列, 应根据在其之前

2、输入的 字符序列所属的语法成分, 决定此字符序列的正确的语法成分 (如:123 在某各命令行里可被解释为数字,而在另 一个命令行里则可能被解释为名字。 ) 。 3 基于图形界面的操作系统, 鼠标操作代替了落后的命令行方式来完成人机交互操作, 这时基本的用户操作在软件系统内 被翻译为有限的几种鼠标事件。 不同鼠标事件序列, 对应了不同的操作意图。 这也是当前行为取决于以前行为的结果的例子。 4 根据 当前事件,以及 对以前事件的响应的结果 决定对当前事件的响应的软件对象的动态行为,称为是 事件驱动事件驱动的。 在 UML 里,最适合于描述这类动态行为的建模手段,就是 状态机状态机。 状态机 用状

3、态状态 记录以前的动态行为的结果, 用变迁变迁 描述软件对象对外来事件的响应以及响应的状态的变化。 5 例如:图 16.1 描述一个软件的图形用户界面的动态行为的状态机。 它描述 的是一个位图观察器的 图象浏览工具 的动态行为。 它可以通过鼠标在窗口上拖动图象,以观察图象的不同局 部。 6 位图浏览工具将接受三类鼠标消息 鼠标左键按下 鼠标移动 鼠标左键释放。 当使用者选中了位图浏览工具后 此工具的状态机进入 待命状态 此 状 态 在 状 态 机 里 是 一 个 名 字 为 waiting mouse message 的圆角矩形。 在待命状态下, 如果在图形区域内按下了鼠标左键 表示位图浏览工

4、具开始工作,这时, 位图浏览状态机进入 活跃状态 (名字为 active 的圆角矩 形) 。 7 在活跃状态下,如果鼠标左键被释放,则 状态机的状态立即恢复到 待命状态; 如果在活跃状态下发生了 鼠标移动事件, 则位图被拖动, 位图在窗口里的位置被更新, 并被重新显示。 如果在待命状态下发生了鼠标移动事件,则 此事件被忽略。 8 在 UML 中,除了状态机之外, 还有一种为动态行为建模的手段, 这就是交互(第四章) 。 交互强调的是 对象之间的互相协作, 通过软件对象的交互实现软件系统的设计功能。 状态机则强调的是 对象本身对对象外部发生的事件的响应及伴随的状态的变化。 对状态机而言,它所能描

5、述的对象是广义的。 状态机描述的对象 可以是类的实例, 可以是用例的实例, 甚至可以是非软件对象。 对于任何一个对象, 如果此对象的动态行为具有事件驱动的特性, 就适合于用状态机来建模。 9 例如, 对于非软件对象, 可以用状态图描述业务部门的工作规则; 对于软件对象, 用状态图描述接口的调用的逻辑规则 和用户对软件系统的使用过程, 也可以用状态图描述单个对象的动态行为的运行逻辑。 10 2、状态机的定义及构成、状态机的定义及构成 状态机用于为具有事件驱动的特征的动态行为进行建模。 事件驱动的动态行为的特点 对象当前时刻的动态行为将取决于 当前的事件输入和 此对象在以前时刻的动态行为产生的结果

6、。 为描述这类动态行为,状态机内部 设置了 状态 以记录以前的行为的结果, 设置了 变迁 以描述状态机对外部事件的响应及相应的状态变化。 在 UML 里,设有相应的图形符号以描述这些建模元素。 11 状态状态是软件对象在其生存期内满足特定条件的存在,在此条件下,对象 能执行特定的动作、或等待事件的发生。 状态被图形化表示为一个圆角矩形(图 16.3) 。 除了用圆角矩形表示的状态外, 还有两种特殊的状态, 分别用 一个实心圆形和 内有一个实心圆的圆环表示。 用实心圆形表示的称为 初始状态初始状态。 初始状态初始状态是状态机的所在对象被创建时刻所处的状态。 状态机所在对象在创建后状态机产生的第一

7、个变迁将从 初始状态出发。 用带实心圆的圆环表示的状态称为状态机的 终止状态终止状态(final state) 。 状态机处状态机处于终止状态表明此状态机的执行已经完成。 状态机处于终止状态后,不会发生任何直接转入此状态机 的其它状态的变迁。 12 变迁变迁被定义为软件对象的两个状态之间的关系,表明在指定的事件发生 后,在特定的条件下,对象执行指定的动作,并进入另一个状态。 变迁被图形化表示为 连接两个状态的箭头, 箭头起始端是变迁发生前的状态, 箭头所指的状态是变迁完成后的状态。 如果对象的状态发生了沿变迁箭头所指的方向的变化,那么此变迁 被称为被 激发激发(fire) 。 变迁的激发,可以

8、和特定的事件联系起来,这样的事件被称为 触发事件触发事件(event trigger)。 只有当触发事件发生了,此变迁才有可能被激发。 当变迁被激发后, 状态机所在的对象将 执行某种动作 作为对此事件的响应。 13 在 UML 里,事件事件被定义为是占据特定时间和空间的、且具有特定意义 的刺激的发生。 动作动作(action)被定义为是一个元计算的执行,它可导致模型状态的变化 和值的返回。 事件的发生将导致变迁被激发, 变迁的激发导致和变迁相连的动作被执行, 动作执行完毕后,对象的状态随之发生变化。 14 状态机的定义状态机的定义 在 UML 里, 状态机状态机用于描述对象的行为, 它为对象指

9、定了的一组状态, 并在对象的生存期内为此对象指定了其在响应外界的事件时应执行的动 作及状态变化。 在 UML 的状态机模型里,对象的概念是广义的, 状态机所在的对象, 可以是软件对象, 也可以是非软件对象。 如果是软件对象, 它也不局限于类的实例。 状态机所在的对象还 可以是用例的实例; 可以是协同的实例; 也可以是部件的实例。 15 3、变迁的构成、变迁的构成 变迁用来描述 状态机所在的对象所处的状态的变换。 变迁由事件触发, 变迁的激发还将伴随着特定的动作的执行。 在 UML 里,变迁由五个部分构成,它们是: 起始状态起始状态 目标状态目标状态 触发事件触发事件(event trigger

10、) 触发条件触发条件(guarde condition) 变迁动作变迁动作。 这五个组成部分描述了变迁的各方面的特征。 16 (1) 、起始状态和目标状态) 、起始状态和目标状态 变迁描述的是状态机所在的对象的状态的变化。 变迁的被激发使得对象 从一个状态转换为另一个状态。 变迁被激发之前对象所处的状态就是变迁的 起始状态起始状态。 因此,起始状态也是被变迁影响的状态。 变迁完成之后,对象的状态发生了变化, 这时对象所处的状态就是变迁的 目标状态。目标状态。 目标状态目标状态是变迁完成之后被激活的状态。 在绘制状态机时, 变迁的起始状态位于表示变迁的箭头的起始位置; 变迁的目标状态是表示变迁的

11、箭头所指向的那个状态。 17 一个变迁可以有多个起始状态, 这时,代表状态机所在对象中的多个控制流在变迁发生的时刻汇合 为一个控制流。 一个变迁也可以有多个目标状态,它表示状态机所在对象在变迁被激发 的时刻其中的一个控制流被分解为多个控制流。 在 UML 中,变迁的多起始状态和多终止状态的情形通常通过 活动图活动图 表现。 18 (2) 、触发事件) 、触发事件 状态机描述了对象的具有事件驱动特征的动态行为。 在此类动态行为中,对象的 动作的执行 状态的改变 都是以特定事件的发生为前提的。 变迁的触发事件描述的就是引发状态机所在对象的动作的事件。 触发事件触发事件是状态机在某变迁的起始状态状态

12、下能接受的一个事件, 此事件的发生使得变迁的激发成为可能。 19 (3) 、触发条件) 、触发条件 触发事件的发生只是变迁被激发的前提。 要使变迁被激发 状态机所在对象必须还 满足一个条件, 这条件就是 触发条件触发条件。 触发条件触发条件是一个布尔表达式,只有当变迁的触发事件发生后,此表达式 才被求值,并且在其值为真的时候,变迁才被激发。 20 (4) 、变迁动作() 、变迁动作(action) 事件的发生不仅仅导致状态机所在对象的 状态的变化, 它还要导致 对象执行特定的动作, 这动作称为 变迁动作。 变迁动作变迁动作是伴随着变迁的激发被执行的一个元计算。 元计算是软件对象能执行的计算的最

13、小单元。 它将 直接作用于状态机所在的对象, 间接地作用于和此对象有连接关系的对象。 21 (5) 、触发事件、触发条件、变迁动作的图形化表示) 、触发事件、触发条件、变迁动作的图形化表示 在绘制变迁时,变迁的触发事件、触发条件和变迁动作被表达成一个字符串 被放置在表示变迁的箭头上。此字符串又被称为变迁的文字标记文字标记(text label) 。变 迁的文字标记的格式如下: 触发事件触发事件 触发条件触发条件/变迁动作变迁动作 在变迁的文字标记中,首先出现的是触发事件,然后是由方括号括起来的触 发条件,它是一个布尔表达式,触发条件后面是一个用斜杠( / )表示的分隔符,分 隔符后面是表现变迁

14、动作的字符串。 变迁的文字标记的三个部分以及文字标记本身都是可以省略的。如果其中的 触发事件被省略,则此变迁被称为是无触发变迁无触发变迁(triggerless transition)。无触发变 迁又被称为是完成变迁完成变迁(completion transition),因为此变迁在其起始状态被激活 且其入口动作被执行后将被自动触发。 22 4、状态的构成、状态的构成 状态是状态机的重要组成部分, 它记录了状态机所在对象的动态行为的执行所产生的有意义的结 果。 所谓有意义,指的是 此结果将影响对象对后续事件的响应。 例如:在图 16.1 所示的位图浏览工具, 如果对象处于 活跃状态,就意味着

15、鼠标左键正处于被按下的状态, 位图当前正在被拖动。 在此状态下, 鼠标的移动事件、 鼠标左键的释放事件 都是有意义的, 它们的发生都会产生合法的响应。 23 而在待命状态, 这同样两个事件都无意义, 它们的发生都被忽略。 在待命状态,只有鼠标左键被按下才是有意义的, 它会使位图浏览工具进入活跃状态, 并产生使用者期望的响应(位图被拖动) 。 24 一个完整的状态包括五个组成部分,它们是: 名字名字 人口人口/出口动作出口动作 内部变迁内部变迁 延迟事件延迟事件 状态活动状态活动 (图 16.3) 。 25 (1) 、名字) 、名字 状态名字由一个字符串构成, 用以标识不同的状态。 状态名字可以

16、省略, 这时,此状态就是 匿名状态。 状态名被放置在状态图符的顶部。 26 (2) 、入口) 、入口/出口动作出口动作 一个状态可以有多个转入变迁和多个转出变迁。 在每次状态被转入或转出时,有可能 希望状态机所在的对象都执行同样的操作。 27 例如: 许多图形/图象软件都有多个鼠标工具, 这些鼠标工具通常以图形按钮的形式排列在用户界面的 工具栏上。 用户可以用鼠标在工具栏上选择所需的工具。 当某个工具被选中时, 此工具的图标被加亮显示, 以表示此工具当前正在工作。 这种鼠标工具的切换机制可以用状态机来建模。 这时,每个工具的被选中都是状态机里的一个状 态, 当转入任何一个工具的选中状态时, 无

17、论在此之前被选中的工具是那一个, 被选中的工具的图标都要被加亮显示。 当任何一个被选中的工具被退出选中时, 它的图标都要被恢复正常显示。 对于这种在状态的转入/转出时刻被执行的动作, 可以用状 态的入口入口/出口动作出口动作来描述。 28 在 UML 里,状态的入口入口/出口出口动作动作指的是当状态机进入或退出 此状态时,分别应执行的动作。 在状态里书写入口/出口动作的语法 和变迁的语法类似, 所不同的是在事件的位置上分别用 entry 和 exit 代替。 入口动作的语法是: entry/动作 出口动作的语法是: exit/动作 动作 既代表单一动作, 也可以是动作序列 (在 UML 里,动

18、作序列动作序列(action sequence)也是动作的一 种) 。 29 (3) 、内部变迁) 、内部变迁 图 16.1 的例子 在位图浏览工具的状态机的待命状态下, 如果发生了在图像区域内按下了鼠标左键的事件, 则会激发一个变迁使状态机转入活跃状态。 这时,状态机所在的对象应该在显示窗口上对位图进 行进行适当的标记, 表示目前正在对此位图进行操作。 此标记应一直保持, 一直到状态机转入其它状态为止。 这时,状态机所在的对象应执行一个动作把 此标记消除。 30 根据前面的入口/出口状态的定义, 对位图进行添加标记和取消标记的动作可以用入口/出口动作描述。 然而,从图 16.1 上看到, 在

19、活跃状态上, 还存在着一个 自返变迁(self transection), 它响应鼠标拖动事件, 并随时更新位图的位置。 根据自返变迁的定义,自返变迁将 首先使状态机退出当前状态, 然后再重新进入。 因此,在发生自返变迁时,状态机所在的对象将 首先执行此状态的出口动作, 然后再执行进口动作。 31 对于图 16.1 的状态机来说, 入口/出口动作分别在显示窗口上为被操作的位图添加和消除标记, 它们只需在一次拖动作业的开始和结束的时刻被执行, 由于鼠标拖动事件是发生在拖动作业的处理过程中间, 因此,在鼠标拖动事件发生的时刻执行入口/出口事件是多余 的。 为了避免自返变迁引起状态的入口/出口状态的

20、被执行,在 UML 里为状 态设置了 内部变迁内部变迁。 状态的内部变迁内部变迁是不会引起状态变化的变迁,此变迁的触发不会导致状 态的入口/出口动作的被执行。 图形表示 由于内部变迁不引起状态的转换, 因此它的文字标识(text lable)被附加在表示状态的圆角矩形 内部, 不使用箭头进行图形标识。 32 内部变迁的文字标识与外部变迁没有区别,具有如下形式: 事件/动作表达式 在图 16.1 的活跃状态上, 为了避免在发生鼠标拖动事件时引起位图被选标记的不必要的闪 烁, 可以把”mouse move”变迁由自返变迁改为内部变迁。 33 (4) 、延迟事件) 、延迟事件 状态机用于为带有事件驱

21、动特性的对象动态行为建模。 具有此种动态行为的对象在其运行的过程中间 将处理各种事件的发生。 对于每个特定的状态,总有某些事件被处理,某些事件被省略。 然而,在某些应用的情形下,在状态机的特定的状态, 某些事件可能不能被马上处理, 但也不能被忽略, 它们应该以队列的方式被缓存起来, 留待系统进入合适的状态的时候再被处理。 34 仍然以位图浏览鼠标工具为例。 当此工具的状态机处于活跃状态时, 如果用户按下了选择菜单的快捷键, 这时,由于软件系统正在处理位图浏览操作, 因此不应对菜单事件有所响应, 否则将产生操作上的混乱。 但此菜单事件不应被忽略, 应该在鼠标工具处于空闲状态的时候被处理。 对于这

22、类被延迟处理的事件,在 UML 里,可以使用状态的 延迟事件延迟事件进行建模。 延迟事件延迟事件是事件的一个列表,此列表中的事件在当前状态发生时不 会被处理,但它们会被按先后顺序暂存,留待状态机进入其它状态 后,再被处理。 状态的延迟事件可用于定义状态的内部变迁, 当一个内部变迁的触发事件是延迟事件时, 在此变迁的动作的部分使用 UML 的保留动作 defer 代替(图 16.3)。 35 (5) 、状态活动) 、状态活动 当状态机处于某一特定的状态的时候, 它通常静止地等待着事件的发生。 但有时可能对象在等待事件发生的时候, 需要此对象也同时不停地执行某些动作。 状态的这种特性,在 UML

23、里,可以用 状态活动状态活动 (activity) 来建模。 状态活动状态活动是一组非原子的计算的执行,在此状态下,这些计算被顺序执 行直至被打断。 当 状态被转入 并且入口状态也被执行之后, 状态的活动就开始执行, 直至发生了外部变迁(转出变迁、自反变迁)为止。 36 状态的活动的表示也采取了变迁的形式(图 16.3) , 这时变迁的事件的部分用关键字 do 代替, 变迁的动作部分可以用 一个动作或 一个动作序列 代替。 其含义是 变迁的动作部分的动作或动作序列被顺序地循环执 行。 37 5、子状态、子状态 在复杂的应用中, 当状态机处于特定的状态时, 状态机所在的对象在此刻的动态行为 仍可

24、以用一个状态机来描述。 例如:图象处理软件的鼠标切换机制是一个状态机, 其中的任何一个状态和一个鼠标工具相对应。 所在对象处于其中的任何一个状态表明此状态所对应的鼠标工 具被选中。 当某个工具被选时,此对象对鼠标事件的响应构成了 此工具的动态行为, 这动态行为仍是事件驱动的, 因此, 可以由另一个状态机来描述。 38 在 UML 里,一个状态内部可以包含其它状态, 它们在此状态的内部构成了另一个状态机。 在 UML 里, 子状态子状态被定义为是包含在某一状态内部的状态。 包含子状态的状态称为复合状态复合状态(composite state) 。 不包含子状态的状态称为简单状态简单状态(simp

25、le state)。 当状态从复合状态转出时, 可以以复合状态本身作为转出变迁的源状态, 也可以以复合状态内部的任一个内子状态作为转出变迁的源状态。 不论采取复合状态还是采用子状态作为源状态, 转出变迁都会导致复合状态的出口动作被执行。 39 在绘制状态机时, 子状态可以直接放置到复合状态内部, 以构成一个嵌入的状态机。 子状态本身还可以包含子状态, 这称为 子状态的嵌套。 子状态的嵌套可以有任意的深度。 对于一个复合状态,其中的子状态 可以构成一个状态机, 也可以构成多个状态机。 如果只构成一个状态机,则这些子状态被称为 串行子状态; 如果构成多个状态机,则子状态称为 并行子状态。 ROSE

26、 操作 40 (1) 、串行子状态) 、串行子状态 如果一个复合状态的子状态机所在的对象在其生存期内的任一时刻只能 处于一个子状态,则这些子状态被称为串行子状态串行子状态(sequential substate) 。 所有串行子状态,构成了复合状态的一个 内嵌状态机。 当状态机通过变迁从某一状态转入复合状态时, 此变迁的目标状态 既可以是此复合状态本身, 也可以是复合状态的子状态。 41 如果变迁的目标状态是复合状态本身变迁的目标状态是复合状态本身, 复合状态的内嵌状态机必须有一个必须有一个 初始状态初始状态。 当此指向复合状态自身的变迁被激发后, 状态机所在的对象 首先执行此复合状态的入口动

27、作, 然后 复合状态的内嵌状态机进入初始状态, 并以此初始状态为起点开始运行。 如果转入复合状态的变迁以复合状态的子状态为目标状态如果转入复合状态的变迁以复合状态的子状态为目标状态 42 如果转入复合状态的变迁以复合状如果转入复合状态的变迁以复合状态的子状态为目标状态态的子状态为目标状态, 则复合状态的入口状态首先被执行, 然后复合状态的内嵌状态机 直接进入这个变迁的目标子状态, 并以它为起点开始运行。 复合状态的内嵌状态机开始运行后, 如果某一离开复合状态的变迁被激发如果某一离开复合状态的变迁被激发, 则内嵌状态机的执行被中断, 状态机所在的对象执行复合状态的出口动作后, 转入此变迁的目标状

28、态。 复合状态的转出变迁的源状态 既可以是复合状态本身, 也可以是复合状态的子状态。 43 (2) 、历史状态) 、历史状态 串行子状态构成的 内嵌状态机的执行 可以被 从其所在的复合状态转出的变迁 打断。 如不特殊指定,下一次转入此复合状态的变迁 将使复合状态的内嵌状态机从 此状态机的初始状态 开始运行。 在某些情形下,可能希望 转入此复合状态的变迁在下一次被激发后, 复合状态的内嵌状态机从上次转出时所处的状态开始运行。 为了对这种情形进行建模, 44 UML 设置了一种特殊的状态,称为 历史状态历史状态(history state) 。 历史状态历史状态是一个特殊的子状态,它记录了复合状态

29、被转出时的活跃 子状态。 当转入变迁指向复合状态时, 如果希望子状态机从上一活跃状态开始执行, 则使这个变迁直接指向 历史状态。 45 在绘制状态机时,其中的历史状态 被表示成一个被圆环包围的字母 H(图 16.5)。 用这种方法绘制的历史状态又被称为 浅层历史状态浅层历史状态(shallow history)。 如果一个复合状态内嵌有多层子状态, 浅层历史状态只记忆被转出变迁打断时最外层的 活跃状态。 如果需要历史状态记忆最深层的内嵌活跃子状态(即不再包含 子状态的活跃子状态) ,则应使用 深层历史状态(深层历史状态(deep history state) 。 深层历史状态在绘制时用一个被圆

30、环包围的带星号 的字母 H 表示(H*, 见图 16.5) 。 ROSE 操作 1.选中一个复合状态 2.按右键打开它的规格说明对话框 3.选中 State/Activiey history,将出现历史状态 4.绘制它的转入/转出变迁 5.如果历史状态是深层历史状态,就重复 1,2 然后选 中 Sub state/Activity history 46 历史状态 只有一个无文字标记的转出变迁, 此变迁指向 构成内嵌状态机的各子状态中的一个。 这个变迁指向的子状态的含义是: 当历史状态无历史记录, 且某一从复合状态外部转向历史状态的变迁被激发 时, 内嵌状态机中应被激活的那个子状态。 因此,当第

31、一个转向此历史状态的变迁被激发时, 由于历史状态没有任何历史记录, 历史状态的转出变迁指向的那个状态将被激活。 对于历史状态而言, 只能有从复合状态之外转入的变迁, 不能有从复合状态的子状态转入的变迁。 当复合状态的内嵌状态机运行至它的终止状态后, 历史状态所记忆的历史记录被清除, 在此之后转入此历史状态的变迁,相当于时第一次转入历史状态的 变迁。 47 (3)、并行子状态、并行子状态 如果一个复合状态内部只有串行子状态,那么, 这个复合状态机只有一个内嵌状态机。 在某些情形下,可能需要在复合状态中 内嵌两个或多个并发执行的子状态机。 这时,此复合状态的子状态就是 并行子状态。 在 UML 里

32、,并行子状态并行子状态就是在某一复合状态中存在着两个并发执行的 子状态机中的状态。 如图 16.6 所示, maintain 是一个复合状态, 其中包含了两个并行子状态。 ROSE 操作 和 UML 规定的区别 每个子状态机必须被一个复合并行子状态包含 48 如果一个复合状态包含有并发内嵌状态机,那么, 当一个从此复合状态外部指向复合状态自身的变迁被激发后, 复合状态的内嵌并发子状态机便被启动。 各内嵌状态机从其各自的开始状态开始运行。 这时,状态机所在软件对象的控制流被分解为多个控制流, 被分解后产生的控制流的数目和复合状态内包含的并发 内嵌状态机的数目相同。 49 当控制流被分解后, 各状

33、态机按照各自的定义并发地运行, 只有当如下两种情形发生时,控制流被汇合成一个。 第一、当一个从复合状态转出的变迁被激发时。 这时, 各内嵌状态机的的运行被打断; 控制流被汇合成为一个; 对象的状态被从复合状态转出。 第二、各内嵌状态机都运行到了各自的终止状态。 这时, 控制流被汇合为一个; 对象仍处于复合状态, 直至某个外部变迁被激发为止。 50 6、状态机图、状态机图 (1) 、状态机图的定义和特点) 、状态机图的定义和特点 对于大多数非平凡的软件系统而言,具有事件驱动特性的软件对象是大 量存在的,这类对象又被称为反应型对象反应型对象(reactive objects) , 因为它们的动态行

34、为是靠外部事件的作用而启动的。 状态机是为反应型对象的动态行为进行建模的有效手段。 反应型对象所指的对象, 不仅仅局限于类的实例。它还可以包括 用例的实例 软件系统的实例 协同的实例等等。 51 在 UML 里,用状态机对反应型对象的动态行为的建模,是通过 状态机图状态机图(statechart diagram) 表现出来的。 状态机图通过状态、事件、变迁和动作表达了特定状态机动态特性。 在状态机图里可以包含的内容有: 简单状态 复合状态 变迁 事件 动作。 状态机图强调的是 软件对象的控制 在不同的状态之间的流动。 它描述了反应型对象在其整个生存期内的动态行为,包括 此对象对外界事件的响应

35、及其在响应外界事件的过程中本身的状态的 划分和变化。 52 图 16.7 所示的就是一个典型的状态机图。 其中 有简单状态, 也有复合状态。 其中的变迁有 通过事件触发的变迁, 也有无触发事件的完成变迁, 有的变迁还有伴随的变迁动作。 53 状态机在对外部事件作出响应时,会执行相应的动作。 根据状态机的变迁和状态的构成,这些动作 可以伴随着变迁的激发作为变迁动作而被执行, 也可以作为状态的入口/出口或状态活动被执行。 在概念上,根据状态机的动作发生的位置,可以把某些状态机归类为 密里机密里机(Mealy machine) 和摩尔机摩尔机(Moore machine). 如果状态机的所有的动作都

36、作为变迁动作被执行, 那么这个状态机就是 一个密里机。 如果状态机的所有的动作都附加在状态里面,那么这个状态机就是一个 摩尔机。摩尔机。 UML 对状态机内动作附加的位置没有限制, 一个的状态机的各个动作可以同时分别 附加在变迁和状态上。 54 (2) 、状态机图的正向) 、状态机图的正向工程工程 状态机图 不仅仅可以为反应型对象的动态行为进行建模, 而且可以通过对它的建模, 支持包含反应型对象的软件系统的建造。 这就是 状态机图的正向工程。 例如:某个软件系统需要处理具有如下语法的输入字符流: message: string ; 这个字符流由可以任意次重复的 message 构成, 每个 message 包含两个字串(string) 第一个字串以字符结束; 第二个字串紧跟着第一个字串,它以字符;结尾。 处理这个字符流的对象可以看作是一个反应型对象, 55 处理这个字符流的对象可以看作是一个反应型对象 描述这个反应型对象的状态机如图 16.8 的状态机图所示。 在图 16.8 中, 为了描述处理字符流的反应型对象,设置了三个 稳

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论