1、第四章 动态建模系统的动态行为是指对象是如何通过通信来进行协作的,以及系统中的对象是如何在系统的生命周期内改变状态的。交互(Interaction):为产生某种功能而在一组对象之间进行的通信过程。描述交互的动态图: 状态图(State Diagram):可以描述一个对象在其生命周期中拥有哪些状态,该对象在这些状态下的行为,以及什么样的事件会导致状态发生改变。 交互图(Interaction Diagram):可以描述对象之间是如何进行交互和通信的。包括顺序图(Sequence Diagram) 、通信(协作)图(Communication Diagram) 、交互概观图(Interaction
2、 Overview Diagram)以及时序图(Timing Diagram) 。其中,顺序图和通信图都可以显示交互。但是顺序图的焦点在时间上, 而通信图的焦点在空间上。交互概观图显示了一些作为一个较大交互流的部分內容的交互图。时序图显示沿着一个精确时间轴的交互。 活动图( Activity Diagram):是另外一种显示交互的方法,但是活动图的主要焦点是工作。4.1 对象之间的交互两个对象之间的交互是通过一个对象向另一个对象发送消息来实现的。消息的类型: 简单消息:一个平直的控制流。简单消息显示了控制是如何从一个对象传递到另一个对象的,这个过程中并没有描述任何有关对象之间通信的细节信息。
3、同步消息:一个嵌套的控制流,一般是作为操作调用来实现的。只有在处理该消息的操作结束之后,调用者才能恢复继续执行。 异步消息:异步的控制流。对象之间的异步消息表明了不等待语义;发送者不必等待该消息处理完就可以继续执行。同步消息异步消息简单消息立即返回的同步消息图 4.1 消息类型注解4.2 状态图4.2.1 状态和转换 状态和状态转换的概念一个对象的状态是该对象在此之前所执行的所有活动的结果,通常是由对象的属性值所决定的,并且会链接到其他对象。有关对象状态的例子: 货物(对象)已经付款(状态) ; 小轿车(对象)静止不动(状态) ; 机器的引擎(对象)在运转(状态) ; Jim(对象)担任销售员
4、的角色(状态) ; Kate(对象)结婚了(状态) 。当一个事件发生时,对象就可能会改变状态。对象的动态行为可以表现在两个方面:交互和内部状态的变化。 状态图的组成部分 起始点(初态) (Initial State) 结束点(终态) (Final State) 状态(State) 状态转换(State Transition ) 导致状态发生转换的事件状态转换激发(Fire)或状态转换被触发(Triggered)Unpaid Paid 删除货物对象付款创建货物对象图 4.2 货物对象的状态图Onfirst floorMovingupMovingdownMoving tofirst floorId
5、learrivedarrivedarrivedgo upgo upgo downtime-out图 4.3 电梯对象的状态图 状态的组成部分状态名状态变量活动图 4.4 状态的三个部分:状态名、状态变量和活动 活动组成在活动组成中可能会使用的三个标准事件:entry, exit 和 do。活动组成的形式语法(Formal Syntax)是:event-name argument-list /action-expression LoginLogin time = Current timeentry/type“login”exit/login(user name, password)do/get
6、user namedo/get passwordhelp/display help图 4.5 一个名为 login 的状态 状态转换Startingapplicationsdo/loadapplicationsStarting OSdo/load OSBootdo/run biosprogram图 4.6 不带显式事件的状态转换用于确定一个状态转换的形式语法是:event-signature guard-condition/ action-expression send-clause其中,event-signature 的语法定义为:event-name(parameter, .)并且 sen
7、d-clause 的语法是:destination-expression destination-event-name(argument,)Event-Signature(事件签名)event-signature 包括一个事件名(event-name)和相关的参数。参数列表的语法是:Parameter-name:type-expression, Parameter-name:type-expression Onfirst floorMoving tofirst floorIdlearrivedarrivedarrivedgo up (floor)go up (floor)go down (fl
8、oor)time-outMoving updo/moving to floorMoving downdo/moving to floor图 4.7 状态转换上所附的事件带有一个参数 floor带 event-signature 的状态转换的例子如下:draw (f : Figure , c : Color )redraw ( )redrawprint ( invoice )Initializingdo/bootupWorkingShutting Downturn PC on shut down图 4.8 GUI 的状态和状态转换Guard-Condition(保护条件)Onfirst floo
9、rMoving tofirst floorarrivedarrivedarrivedgo up (floor)go up (floor)go down (floor)timer = time-outMoving updo/moving to floorMoving downdo/moving to floorIdletimer = 0do/increase timer图 4.9 guard-condition:timer = time-out带一个 guard-condition 的状态转换的例子如下: t = 15 sec number of invoices n withdrawal (
10、amount ) balance = amount Initializingdo/bootupWorkingShutting Downturn PC on shut downScreensavingtime outkeystrokeormouse movement图 4.10 带保护条件的 GUI 的状态图Action-Expression(动作表达式)Onfirst floorarrivedarrivedgo up (floor)go up (floor)go down (floor)timer = time-out / go down (first floor)Moving updo/mo
11、ving to floorMoving downdo/moving to floorIdletimer = 0do/increase timer图 4.11 在 Idle 状态和 On first floor 状态之间的状态转换上有一个 guard-condition 和一个 action-expression。带有 action-expression 的状态转换的例子如下:increase ( ) / n : = n+1 / m : = m+1add (n) / sum : = sum + n/ flashSend-Clause(发送语句)send-clause 是动作的特殊情况。它是一个用
12、于在两个状态的转换过程中发送消息的显式语法。该语法包括一个 destination-expression 和一个 event-name。例如,下面的 action-expression: timer = Time-out / go down ( first floor )可以被转换成如下的 send-clause: timer = Time-out self.go down ( first floor )其他带有 send-clause 的状态转换的例子如下:out_of_paper ( ) indicator.light( )left_mouse_btn_down ( location )
13、/ color := pick_color ( location ) pen.set ( color )4.2.2 事件事件是指发生的某件事情,它可以导致产生某一动作。Displaydo/displaycurrent timeSet minutedo/displayminutesSet hoursdo/display hoursmode_buttonmode_buttoninc/hours := hours + 1 inc/minutes := minutes + 1mode_buttonDigital_watchmode_button()inc()类状态图图 4.12 Digital_wat
14、ch 类及其相应的状态图在 UML 中有以下四种类型的事件: 条件变为真:这种事件在图形上显示为一个状态转换上的 guard-condition 条件。 接收到一个显式的来自其他对象的信号:在图形上显示为状态转换上的一个 event-signature。 接收到操作调用:对象调用了另一个对象中的操作。在图形上显示为状态转换上的一个 event-signature。 指定的一段时间的消耗:在图形上显示为状态转换上的一个时间表达式。错误也是一种事件例如:errorout_of_memory类可以接收或发送消息。信号也是普通的类,但只用于发送信号。信号类可以使用signal 构造型来构造。 sign
15、alInputabstractdevice: Devicetime: TimesignalMouseabstractup: Booleandown: BooleanxPos: IntyPos: IntsignalKeyboardcharacter: Charup: Booleandown: BooleansignalVoice Recognitioncommando: string signalRight MouseButtonsignalLeft MouseButtonSenddo/send(input) to corresponding classIdle Input输入信号 Input
16、可以是下述任意一种类的对象:Keyboard, Left Mouse Button, Right Mouse Button, Voice Recognition图 4.13 带抽象父类的信号类层次结构Java ImplementationDisplaydo/displaycurrent timeSet minutedo/displayminutesSet hoursdo/display hoursmode_buttonmode_buttoninc/hours := hours + 1 modulo 24 inc/minutes := minutes + 1 modulo 60mode_butt
17、on图 4.14 一个数字手表的状态图public class Statepublic final int Display = 1;public final int Set_hours = 2;public final int Set_minutes = 3;public int value;public class Watchprivate State state = new State ( );private DigitalDisplay LCD = new DigitalDisplay ( ); public Watch ( )state.value = State.Display (
18、);LCD.display_time ( );public void mode_button ( )switch ( state.value )case State.Display :LCD.display_time ( );state.value = State.Set_hours;break;case State.Set_Hours :LCD.display_hours ( );state.value = State.Set_minutes;break;case State.Set_minutes :LCD.display_time ( );state.value = State.Disp
19、lay;break;public void inc ( )case ( state.value )case State.Display :;break;case State.Set_hours :LCD.inc_hours ( );break;case State.Set_minutes :LCD.inc_minutes ( );break;使用中 维修中闲置 报废修好损坏多余 重新使用 不能修好超过年限图 4.15 一个设备使用状态的状态图4.3 在状态图之间发送消息On/Stop On/PlayOffOffOnOn ()Off ()Play () Stop ()Remote Control
20、On () Play ()Off () Stop ()Off()/Stop()CD PlayerOn () Off () Play () Stop ()图 4.16 遥控器对象(Remote Control)向 CD 播放机对象(CD Player)发送消息待命启动加热计时关机加热开机关机暂停温度计时控制器 电烤箱加热( ) 加热( )关机( ) 计时器5 分钟 关机( )加热( )关机( ) 温度120温度140图 4.17 状态图之间的消息发送4.3.1 子状态一个状态可以包含一些嵌套的子状态(Substate) 。这些子状态可能是与子状态(And-substate) ,也可能是或子状态(
21、Or-substate) 。Forward BackwardRunning图 4.18 或子状态Forward BackwardHigh speedLow speedRunning图 4.19 与子状态待机提速运行减速使用中启动开机到达运行速度停机速度=0图 4.20 描述设备使用状况的嵌套状态图4.3.2 历史指示器历史指示器(History Indicator)用来保存内部状态。OS running Restart OSStart Install shieldInstallentry/Ask installing questionsdo/Install SoftwareDisk error
22、entry/fix diskdo/Show question dialogdo/Ask alternativeMemory lowentry/Show question dialogdo/Ask alternativeRestart ()Self.Restart ()HInstall softwareDisk Error ()alternative = continueOut of memory ()alternative = stopalternative = stopalternative = try againCreate()图 4.21 一个安装程序WorkingAwaitingUser InputRegisteringUser InputVisualizingUser InputWatchingSystemClockUpdatingDisplayInterval OverInputHtime out keystrokeormouse movement图 4.22 GUI 的 Working 状态中的子状态4.3.3 UML2.0 中的新变化入口(entry point)出口(exit point)ResidingOn ShelfBeingChecked Outreservedend图 4.23 UML 状态图中的入口和出口