面向对象技术状态图活动图.docx
《面向对象技术状态图活动图.docx》由会员分享,可在线阅读,更多相关《面向对象技术状态图活动图.docx(14页珍藏版)》请在冰豆网上搜索。
面向对象技术状态图活动图
第五章状态图和活动图
状态图
UML中的状态图(statechartdiagram)主要用于描绘一个对象在其生存期间的动态行为,表现一个对象所经历的状态序列,以及对这些事件所作出的反响。
状态图主要是由状态和状态间转移对象构成的。
而事件又是两者之间一个重要的概念。
状态图是UML中对系统的动态行为建模的5个图之一,状态图在检查、调试和描绘类的动态行为时非常有用。
一般可以用状态机对一个对象(这里所说的对象可以是类的实例、用例的实例或整个系统的实例)的生命周期建模,状态图是用于显示状态机的,重点在于描绘状态之间的控制流。
状态图根本概念
状态图中的几个根本概念有:
状态、组合状态、子状态、历史状态、转移、事件和动作。
.1状态
状态(state)是指在对象的生命期中的某个条件或状况,在此期间对象将满足某些条件、执行某些活动或等待某些事件。
所有对象都具有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态将发生变化。
一个状态有以下几个局部:
状态名(name)、进入/退出动作(entry/exitation),内部转移(internaltransition)、子状态(substate)、延迟事件(deferredevent)。
状态可以细分为不同的类型,例如初态、终态、中间状态、组合状态、历史状态等。
一个状态图只能有一个初态,但终态可以有一个或多个,也可以没有终态。
中间状态包括两个区域:
名字域和内部转移域,如图所示。
其中内部转移域是可选的。
图5.2:
状态的例子
图的状态的名字是Lighting。
当进入这个状态时,做开灯(turnOn)动作,分开这个状态时,做关灯(turnOff)动作,当对象处于这个状态时,灯要闪烁5次(blinkFivetimes),当电源关闭(pwoerOff)事件出现时,使用自供给电源(powerSupplySelf)e需要注意的是,对象在Lighting状态时,有一个被延迟处理的事件,即当出现自检(seflTest)事件时,对象将延迟响应这个事件。
即不在Lighting这个状态中处理这个事件,而是延迟到以后在别的状态中处理这个事件。
状态图的符号如下列图所示:
.2组合状态和子状态
嵌套在另一个状态中的状态称作子状态(substate),一个含有子状态的状态被称作组合状态(compositestate)。
如图5.3所示是组合状态和子状态的例子,其中W是组合状态,E,F是子状态。
图
从图5.3可以看出,组合状态中也可以有初态和终态。
转移r是从状态B转移到组合状态W本身,转移P那么是从A状态直接转移到组合状态中的子状态E类似地,可以从组合状态中的子状态直接转移到目的状态(如转移s),也可以从组合状态本身转移到目的状态(如转移v).
子状态之间可分为or关系和and关系两种。
or关系说明在某一时刻仅可到达一个子状态,and关系说明组合状态中在某一时刻可同时到达多个子状态。
如图5.4所示是子状态之间or关系的例子。
图5.4:
子状态之间的or关系
如图所示是子状态之间and关系的例子。
其中子状态Forward和Lowspeed之间,Forward和Highspeed之间,Backward和Lowspeed之间、Backward和Highspeed之间都是and的关系。
图5.5:
子状态之间的and关系
.3历史状态
历史状态(historystate)是一个伪状态(pseudostate),其目的是记住从组合状态中退出时所处的子状态。
当再次进入组合状态时,可直接进人这个子状态,而不是再次从组合状态的初态开场。
在UML中,历史状态用符号
或
表示,其中
是浅〔shallow)历史状态的符号,表示只记住最外层组合状态的历史;
是深〔deep)历史状态的符号,表示可记住任何深度的组合状态的历史。
顺便提一下,UML中其他建模元素的符号都是直接采用图形符号,没有采用英文字母,如类采用矩形符号,用例采用椭圆符号等,只有历史状态的表示符号中采用了英文字母。
需要注意的是,假如一个组合状态到达了其终态,那么会丧失历史状态中的信息,就好似还没有进人过这个组合状态一样。
如图5.6所示是历史状态的例子。
这是一个对数据进展备份时的状态图,备份时要经过Collecting,Copying,CleaningLlp等几个状态。
假如在进展数据备份过程中,有数据查询恳求,那么可以中断当前的备份工作,然后回到Command状态进展查询操作。
查询完毕后,可以从Command状态直接到刚刚中断时退出的状态接着进展备份操作。
(例如,假如刚刚是从Copying状态被中断退出的,那么如今可以直接从Command状态到Copying状态。
)
当然,假如不采用历史状态,也可以用别的状态图表示出和图8.fi的状态图一样的意思,但得到的状态图中要增加许多新的状态、转移或变量,这样状态图就显得过于混乱和复杂。
5.1.1.4转移
转移(transition)是两个状态之间的一种关系,表示对象将在第一个状态中执行一定的动作,并在某个特定事件发生而且某个特定的戒备条件满足时进人第二个状态。
描绘格式如下:
Event-signatue’[‘guad-condition’]’‘/’action
其中event-signature是事件特征标记,guad-condition是戒备条件,action是动作,而事件特征标记的格式为:
event-name’(’comma-separated-parameter-list’)’
其中event-name是事件名,comma-separated-parameter-list是逗号分隔的参数列表。
:
互相之间互斥的转移
.5事件
事件(event)是对一个在时间和空间上占有一定位置的有意义的事情的详细说明。
事件产生的原因有调用、满足条件的状态的出现、到达时间点或经历某一时间段、发送信号等。
在UML中,事件分为4类:
〔1〕调用事件〔callevent〕。
调用事件表示的事对操作度的调度,其个格式如下:
Event-name’(comma-separated-parameter-list’)’
其中event-name是事件名,comma-separated-parameter-list是逗号分隔的参数列表。
如图所示是调用事件的例子,其中事件名是startAutopilot,参数是normal。
〔2〕变化事件〔changeevent〕。
假如一个布尔表达式中的变量发生变化,使得该布尔表达式的值相应地变化,从而满足某些条件,那么这种事件称作变化事件。
变化事件用关键字when表示,如图5.9所示是变化事件的例子。
变化事件和戒备条件(guardcondition)这两个概念很相似,两者的区别是戒备条件是转移(transition)说明的一局部,只在所相关的事件出现后计算一次这个条件,假如值为false,那么不进展状态转移,以后也不再重新计算这个戒备条件,除非事件又重新出现。
而变化事件表示的是一个要被不断测试的事件。
〔3〕时间事件〔timeevent〕。
时间事件指的是满足某一时间表达式的情况的出现,例如到了某一时间点或经过了某一时间段。
时间事件用关键字after或when表示,如图5.10所示是时间事件的例子。
0时间事件
〔4〕信号事件〔signalevent〕。
信号事件表示的是对象接收到了信号这种情况,信号事件往往会触发状态的转移。
这里提到了信号这个概念,所谓信号,就是由一个对象异步地发送、并由另一对象接收的已命名的对象。
在UML中,信号用版型为<>的类表示,信号之间可以具有泛化关系,形成层次构造。
如图5.11所示是信号之间泛化关系的例子。
图5.11:
信号事件
信号事件和调用事件比拟相似,但信号事件是异步事件,调用事件一般是同步事件。
另外,信号事件和调用事件的表示格式是一样的。
5.2活动图
活动图是对系统的动态行为建模的5个图之一。
在OMT,Booch,OOSE方法中并没有活动图的概念,UML中的活动图的概念是从别的方法中借鉴来的。
与JimOdell的事件图、Petri网、SDL建模技术等类似,活动图可以用于描绘系统的工作流程和并发行为。
活动图其实可看作状态图的特殊形式,活动图中一个活动完毕后将立即进人下一个活动〔在状态图中状态的转移可能需要事件的触发)。
活动图的几个根本概念有:
活动、泳道、分支、分叉和集合、对象流。
活动
活动(activity)表示的是某流程中的任务的执行,它可以表示某算法过程中语句的执行。
在活动图中需要注意迷分动作状态(actionstale)和活动状态(activitystate)这两个概念。
动作状态是原子的,不能被分解,没有内部转移.没有内部活动,动作状态的上作所占用的时间是可忽略的,动作状态的目的是执行进人动作(entryaction),然后转向另一个状态。
活动状态是可分解的,不是原子的,其工作的完成需要一定的时间可以把动作状态看作活动状态的特例。
泳道
泳道(Swimlane)是活动图中的区域划分,根据每个活动的职责对所有活动进展划分,每个泳道代表一个责任区。
泳道和类并不是一一对应的关系.泳道关心的是其所代表的职责,一个泳道可能由一个类实现,也可能由多个类实现。
如图所示是使用泳道的例子。
图泳道
分支
在活动图中,对于同一个触发事件,可以根据不同的戒备条件转向不同的活动,每个可能的转移是一个分支(branch)。
在UML.中表示分支有两种方法,如图所示,这两种表示方法的区别是,右边的活动图采用菱形符号表示分支。
图分支的两种表示方法
分叉和集合
分支表示的是从多种可能的活动转移中选择一个,假如要表示系统或对象中的并发行为,那么可以使用分叉(fork)和集合(join)这两种建模元素。
分叉表示的是一个控制流被两个或多个控制流代替,经过分叉后,这些控制流是并发进展的;集合正好与分叉相反,表示两个或多个控制流被一个控制流代替。
如图所示是分叉和集合的例子。
图分叉和集合
对象流
在活动图中可以出现对象。
对象可以作为活动的输人或输出。
活动图中的对象流表示活动和对象之间的关系,如一个活动创立对象(作为活动的输出)或使用对象(作为活动的输人)等。
对象流属于控制流。
所以假如两个活动之间有对象流,那么控制流就不必重复画出了。
如图所示是使用了对象流的活动图。
图对象流
活动SubmitDefect创立对象Defect,该对象的状态是Submitted,活动FixDefect,使用处于Submitted状态的对象Defect,同时把对象的状态改为Fixed状态。
5.3活动图的用处
活动图对表示并发行为很有用,其应用非常广泛。
一般活动图可以对系统的工作流程建模,即对系统的业务过程建模,也可以对详细的操作建模,用于描绘计算过程的细节。
用活动图对工作流程建模的例子。
如图所示的用例图有两个用例:
产品制造(MakePart)和发货(shipPart)。
图用例图
在进展用例分析时,可以用活动图来描绘详细的工作流程。
由于这个工作流程涉及两个用例,所以采用脚本或顺序图都很难描绘,而采用活动图那么可以很好地解决这个问题。
如图所示是对这个工作流程的详细描绘例子。
图用活动图描绘工作流程
活动图除了可以对工作流程建模外,也可以对详细的操作建模。
在构造化分析和设计中,开发人员往往用流程图来描绘一个算法。
在UML中没有流程图的概念,从某种意义上说,活动图的功能已包含了流程图。
假如需要描绘一个算法,可以用活动图来描绘。
如图所示是用活动图描绘Line类的求直线交点的算法[BRJ99,p272],这个算法本身并不难。
这里采用这个例子只是说明活动图的一个作用。
+
图用活动图描绘算法
5.4活动图和状态图的比拟
状态图和活动图都是对系统的动态行为建模,两者很相似,但也有区别。
首先,两者描绘的重点不同。
状态图描绘的是对象的状态及状态之间的转移,而活动图描绘的是从活动到活动的控制流。
其次,两者使用的场合不同。
假如是为了显示一个对象在其生命周期内的行为,那么使用状态图较好,假如目的是为了分析用例,或理解涉及多个用例的工作流程,或处理多线程应用等,那么使用活动图较好。
当然,假如要显示多个对象之间的交互情况,用状态图或活动图都不合适,这时可用顺序图或协作图描绘。