大家好,又见面了,我是你们的朋友全栈君。
本文主要介绍状态图和活动图。
一.状态图
状态(state)是指在对象的生命期中的某个条件或状况,在此期间对象将满足某些条件、执行某些活动或等待某些事件。所有对象都具有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态发生变化。
状态图(statechart diagram):
用来描述一个特定的对象所有可能的状态,以及由于各种事件的发生而引起的状态之间的转移和变化。
并不是所有的类都需要画状态图,有明确意义的状态,在不同状态下行为有所不同的类才需要画状态图。如下,
一个机器的状态图
再如,CD Player的状态图
1.状态
一个状态有以下几个部分:状态名(name)、进入/退出动作(entry/exit action)、内部转移(internal transttion)、子状态(substate)、延迟事件(dferred event)。
状态可以细分为不同的类型,例如初态、终态、中间状态、组合状态、历史状态等。一个状态图只能有一个初态,但终态可以有一个或多个,也可以没有终态。
中间状态包括两个区域:名字域和内部转移域,如图所示。其中内部转移域是可选的。
横线上面是名字域,下面是转换域(可选)。
ntry/turnOn:当转入该状态时,做开灯动作。
do/blinkFivetimes:当处于该状态时,灯闪烁5次。do活动是只在状态内出现的活动,不能附加到转换上。
event poweroff/powerSupplySelf:当电源关闭事件发生时,用自备电源。
exit/turnOff:当转出该状态时,做关灯动作。
event selfTest/defer:当selfTest事件发生时,对象将延迟响应,到别的状态中再处理,用defer这个特定动作表示延迟。
2.状态图的要素
椭圆或圆角矩形:表示对象的一种状态,椭圆内部填写状态名
箭头:表示从箭头出发的状态可以转换到箭头指向的状态
事件:引起状态转换的原因。事件名可在箭头线上方标出
条件:事件名后加方括号,括号内写状态转换条件
实心圆:初始状态
内部实心的同心圆:最终状态
3.状态的类型
①按状态过程分:
②含有子状态的状态被称为组合或嵌套状态
组合状态可以使用“与”关系分解为并发子状态,或者通过“或”关系分解为互相排斥的顺序子状态。两种表示方法:
顺序子状态
如果一个组成状态的子状态对应的对象在其生命期内的任何时刻都只能处于一个子状态,即多个子状态之间是互斥的,不能同时存在,这种子状态称为顺序子状态。
并发子状态
有时组合状态有两个或者多个并发的子状态机,此时称组成状态的子状态为并发子状态。
③历史状态是伪状态, 其目的是记住从组合状态中退出时所处的子状态, 当再次进入组合状态时, 可以直接进入这个子状态, 而不是再从组合状态的初态开始。
CD Player,running状态被打断到power on状态,再转回到running状态时,希望直接进入历史状态
4.转移(Transition)
转移是两个状态间的一种关系,表示对象将在当前状态中执行动作,并在某个特定事件发生或某个特定的条件满足时进入后继状态。 每个转移只允许有一个事件触发,一个事件只允许有一个动作。
①转移的五要素(注意格式)
格式:事件(参数)[条件]/动作
▪源状态
▪目标状态
▪触发事件
-如果箭头上不带任何事件名,表示是一个自动转换,当与源状态相关的活动完成时就会自动触发。
▪监护条件
▪动作
②转换的类型
内部转移:不导致状态改变的转移,不会执行entry和exit动作
5.事件(Event)
事件是对一个时间和空间上占有一定位置的有意义的事情的规格说明。事件触发状态的转移。
四类主要事件:
▪信号事件
▪调用事件
▪变化事件
▪时间事件
①信号signer事件
对象之间通过发送信号和接收信号实现通信。信号是一种异步机制。在计算机中,鼠标和键盘的操作均属于此类事件。对于一个信号而言,对象一般都有相应的事件处理器,如onMouseClick()等。
②调用call事件
表示一个操作的调度。一个对象请求调用另一个对象的操作
信号是一个异步事件,而调用事件一般是同步的。也就是说,当对象调用另一对象的操作时,控制就从发送者传送到接收者,该事件触发转换,完成操作后,接收者转换到一个新的状态,控制返还给发送者。
③变化change事件
用关键字When,后面跟布尔表达式
When(temperature>120)/alerm()
变化事件的意图是要频繁测试表达式,只要表达式由假变为真,事件就会发生。
注意: 变化事件与监护条件的区别
④时间(time)事件
时间事件是指在绝对时间或在某个时间间隔内发生的事情所引起的事件。
例如到达某一时间或经过了某一时间段。用关键字When 或After表示。
6.状态图建模技术
建模步骤:
①找出适合用模型描述其行为的类。
②确定对象可能存在的状态。
③确定引起状态转换的事件。
④确定转换进行时对象执行的相应动作。
⑤对建模的结果进行相应的精化和细化。
二.活动图
1. 活动图的概念
活动图(activity diagram)是UML的动态视图之一,用来描述事物或对象的活动变化流程。活动图可看作状态图的特殊形式。特殊性在于活动图中的一个活动结束后将立即进入下一个活动而不需要事件触发活动的转移。
活动图用于描述系统的工作流程和并发行为。活动图被设计用于简化描述一个过程或操作的工作步骤。例如,可以用活动图对一个软件的开发过程建模;还可以对诸如求Fibnacci数列第n个数的数值之类的操作进行建模。
活动图示例:
2.活动图的组成元素:
▪活动(Activity)
▪动作流(Action Flow)
▪分支(Branch)与合并(Merge)
▪分叉(Fork)和汇合(Join)
▪泳道(Swimlane)
▪对象流(Object Flow)
3.活动
活动(activity)表示的是某流程中的任务的执行,它可以表示某算法过程中语句的执行。活动在活动图中表现为一个由一系列动作组成的非原子的执行过程。
动作状态(Action State)
活动状态(Activity State)
①动作状态
动作状态是指执行原子的、不可中断的动作,并在此动作完成后通过完成转换转向另一个状态的状态。
动作状态使用平滑的圆角矩形表示,动作状态所表示的动作写在圆角矩形内部。
②活动状态
活动状态是可分解的,不是原子的,其工作的完成需要一定的时间。
可把动作状态看作活动状态的特例。
活动状态的表示图标也是平滑的圆角矩形,并可以在图标中给出入口动作和出口动作等信息。
4.动作流
所有动作状态之间的转换流称之为动作流。
活动图的转换不需要特定事件的激发,一个动作状态执行完后自动转换到另外一个状态。
活动图的转换用带箭头的直线表示。
可用条件限制转换。
5.分支与合并
分支一般用于表示对象类所具有的条件行为。
条件行为用分支和合并表达。
一个分支有一个入转换和两个带条件的出转换,出转换的条件应当是互斥的。
一个合并有两个带条件的入转换和一个出转换,合并表示从对应的分支开始的条件行为的结束。
6.分叉与汇合
分叉用于将动作流分为两个或者多个并发运行的分支,而汇合则用于同步这些并发分支,以达到共同完成一项事务的目的。
分叉可以用来描述并发线程。
汇合代表两个或多个并发控制流同步发生,当所有的控制流都达到汇合点后,控制才能继续往下进行。
7.泳道
泳道将活动图中的活动化分为若干组,并把每一组指定给负责这组活动的业务组织,通常为对象。
泳道区分了负责活动的对象,明确地表示了哪些活动是由哪些对象进行的。
每个活动只能明确地属于一个泳道。
泳道用垂直实线绘出,垂直线分隔的区域就是泳道。在泳道上方可以给出泳道的名字或对象(对象类)的名字,该对象(对象类)负责泳道内的全部活动。
泳道没有顺序,不同泳道中的活动既可以顺序进行也可以并发进行,动作流和对象流允许穿越分隔线。
8.活动的分解
一个活动可以分为若干个动作或子活动,这些动作和子活动本身可以组成一个活动图。
一个不含内嵌活动或动作的活动称之为简单活动;一个嵌套了若干活动或动作的活动称之
为组合活动,组合活动有自己的名字和相应的子活动图。
一个包含子活动的活动和嵌套了子状态的组合状态类似,概念上也相对统一。
9.活动图的用途
▪对系统工作流程建模
工作流:是一个良好定义的动作序列,执行时将产生一个可观察的值,或者产生一个个体或实体的对象。
▪对工程组织过程建模
▪对算法流程建模
①对系统工作流的建模
10.活动图建模技术
①识别要对其工作流描述的类或对象。
②确定工作流的初始状态和终止状态,明确工作流的边界。
③对动作状态或活动状态建模。
④对动作流建模。
⑤对对象流建模。
⑥对建立的模型进行精化和细化
三.活动图与状态图的比较
1.活动图与状态图的相同点:
都是对系统的动态行为建模。
2.活动图与状态图的区别:
①描述对象不同
状态图:描述对象状态及状态之间的转移;
活动图:描述从活动到活动的控制流。
②使用场合不同
状态图:描述对象在其生命期中的行为状态变化;
活动图:描述过程的流程变化。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132031.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...