UML核心技术学习(五)

    技术2022-05-11  18

    第五章       动态建模

           所有系统均可表示为两个方面:静态结构动态行为类图(class diagram最适合于描述系统的静态结构:类、对象以及它们之间的关系;而状态序列协作活动图则适合于描述系统的动态行为,即描述系统中的对象在执行期间不同的时间点是如何动态交互的。

           对象是如何进行通信以及通信的结果如何则是系统的动态行为,对象通过通信来协作的方式以及系统中的对象在系统的生命周期中改变状态的方式是系统的动态行为。一组对象为了实现一些功能而进行通信称之为交互,可以通过序列图状态图活动图来描述:

    l         状态图:状态图描述对象在生命周期内处于哪些状态,每一种状态的行为以及什么样的事件引起对象状态发生改变

    l         序列图:描述对象如何相互交互通信。序列图中最重要的是时间,通过它,可以看出为了完成某种功能一组对象如何发送和接收一序列消息(时间)

    l         协作图:协作图也是描述对象交互的,但侧重于空间的协作,即明确地给出对象间的关系(链接)(空间)

    l         活动图:描述对象的交互,侧重于工作的描述,当对象相互交互时,需要执行一些工作或活动(活动)

    除了静态结构和动态行为外,还可以从功能的角度来描述系统。用例就是从功能的角度来描述系统的:它描述角色如何使用系统

    5.1   对象之间的交互-消息

           在所有动态图(如上四种图)中,消息是作为对象间的一种通信方式来表示的,具体来说,消息是连接发送者和接收者的一根箭头线,箭头的类型表示消息的类型

    l         简单消息:表示普通的控制流,可以表示一个同步消息的返回

    l         同步消息:一个嵌套控制流,一般表示一个操作调用

    l         异步消息:异步控制流中,没有直接的返回给调用者,发送者发送完消息后不需要等待消息处理完成而是继续执行

    5.2   状态图

           状态图主要用来描述对象、子系统、系统的生命周期。通过状态图可以了解到一个对象所能到达的所有状态以及对象收到的事件(收到消息,超时,错误,条件满足)对对象状态的影响等。所有的类,只要它有可标记的状态和复杂的行为,都应该有一个状态图

    5.2.1   状态和转移

           所有对象均有状态:状态是对象操作的前一次活动的结果,通常,状态由对象的属性值以及指向其他对象的链来决定的

           当某些事情发生时对象的状态发生改变,我们称改变对象状态的事情为“事件”

           动态型表现在两个方面:交互内部状态改变交互描述对象的外部行为以及对象如何与其它对象交换信息;内部状态改变描述对象是如何改变其状态的

           一个状态包含三个部分:状态的名称、可选的状态变量名和变量值、活动表

    活动表中常使用三种标准事件:进入、退出、做;语法-  事件名 参数表 ‘/’ 动作表达式

    5.2.1.1 事件说明(Event-Signature

           event-signature”由事件名、参数、触发状态转移的事件、与此事件有关的附加数据组成,语法:    参数名 ‘:’ 类型表达式,参数名 ‘:’ 类型表达式……

           如图:在“空闲”状态,将属性值timer的值置0,然后连续递增timer的值,直到“下楼”或“上楼”事件的发生或守卫条件“timer=超时值”成真

    5.2.1.2 守卫条件(Guard-Condition

           守卫条件是状态转移中的一个布尔表达式,如果将守卫条件和事件说明放在一起使用的话,则当且仅当事件发生且布尔表达式成立时,状态转移才发生,几个示例如下:

           [ t = 15sec ]

           [ number of invoices > n ]

           withdrawa1 (amount) [ balance >= amount ]

    5.2.1.3 动作表达式(Action-Expression

           动作表达式是一个过程表达式。如

           increase() / n := n + 1 / m := m + 1

           add(n) / sum := sum + n

           / flash

           [timer=超时值]/下楼(第一层)

    5.2.1.4 发送子句

           发送子句是动作的特例。它被用来在两个状态转移之间发送消息。发送子句由目的表达式事件名组成。目的表达式由一个或多个对象组成,事件名是对目的对象(一组对象)有意义的事件的名称,目的对象可以是对象本身

           可以将:[ timer = Time-out ] / go down (first floor)

           转换成一个发送子句:[ timer = Time-out ] ^ self.go down (first floor)

           又如:out_of_paper() ^ indicator.light()

     left_mouse_btn_down(location) / color := pick_color(location) ^ pen.set(color)

    5.2.2   事件

           “事件”指的是发生的且引起某些动作执行的事情;当事件和动作之间存在着某种必然的联系时,我们将这种关系称为“因果关系”

           如图说明状态图中的事件与类中的操作的关系,该对象有三个状态:正常显示状态、两个设置时钟的状态(小时和分钟)

           UML中有四类事件:

    l         条件成真:即状态转移上的守卫条件

    l         收到另一个对象中的信号:信号本身也是一个对象,表示为事件说明

    l         收到另一个对象(或对象本身)的操作调用,表示为事件说明

    l         经过指定时间间隔,表示为时间表达式

    5.2.3   JAVA实现

    具体Java实现如下:

           State类,用来表示数字表的状态

           Watch类,表

           DigitalDisplay类,

     

     

    public class State   {

           public final int Display = 1;

           public final int Set_hours = 2;

           public final int Set_minutes = 3;

           public int value;

    }

     

    public class Watch  {

           private State state = new State();

           private DigitalDisplay LCD = new DigitalDisplay();

     

           public Watch()   {

                  state.value = State.Display;

                  LCD.display_time();

           }

     

           public void mode_button()    {

                  switch (state.value)  {

                         case State.Display :

                                LCD.display_hours();

                                state.value = State.Set_hours;

                                break;

                         case State.Set_hours :

                                LCD.display_minutes();

                                state.value = State.Set_minutes;

                                break;

                         case State.Set_minutes :

                                LCD.display_time();

                                state.value = State.Display;

                                break;

                  }

           }

     

           public void inc()  {

                  switch (state.value) {

                         case State.Display : break;

                         case State.Set_hours : LCD.inc_hours(); break;

                         case State.Set_minutes : LCD.inc_minutes(); break;

                  }

           }

    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    5.3   状态图之间发送消息

           状态图可以给其他状态图发送消息,状态图间的消息发送可以通过动作(即,在发送子句中指定接收者)或在状态图间的虚线箭头来表示。

    5.3.1   子状态

           状态可能有嵌套的子状态,且子状态可以在另一个状态图,两种:与子状态(and-substate或子状态(or-substate

           与子状态指的是一个状态可以有子状态,但是一次只能有一个子状态(比如一辆车处于运行状态,这个运行状态有两个子状态,前进和后退,不能同时为真)

    也叫(顺序组成状态??)

    也叫(并发组成状态??)

    5.3.2   历史指示器

           历史指示器被用来存储内部状态,比如当对象处于某一状态,经过一段时间后可能会返回到该状态,则可以用历史指示器来保存该状态,使用H表示;可以有多个指向历史指示器的状态转移,但没有从历史指示器开始的状态转移

    软件安装程序,历史指示器用来处理错误,如“内存溢出”、“磁盘错误”等,当错误状态被处理完后,用历史指示器返回到错误之前的状态

    5.4   序列图

           序列图描述对象是如何交互的,并且将重点放在消息序列上,也就是说,序列图是描述消息如何在对象间发送和接收的。它有两个坐标轴:纵坐标轴显示时间,横坐标抽显示对象。

           在序列图的横坐标轴上是与序列有关的对象。

    5.4.1   一般和实例格式

           两种使用序列图的方式:一般格式实例格式实例格式详细描述一次可能的交互,它没有任何条件、分枝或循环,它仅仅显示选定的情节的交互;一般格式则描述所有的情节,包括条件、分枝和循环

           一条消息是一次对象间的通信,通信所传递的信息是期望某种动作发生。通常,接收到一条消息被认为是一个事件,消息可以是信号,操作调用或其他类似的东西,一旦接收到消息,动作就开始执行,我们称为“激活”

           消息也可以有条件,只有条件为真时,才可以发送和接收消息,一次只能发送一条消息

    如上图,描述一个特定情节的序列图,从change消息开始,图中显示了UpdateCustomer消息返回的结果

    如上图,从PrintServerPrinter的消息带有条件,说明在序列图中如何描述选择,要么发送Print消息给Printer,要么发送消息StoreQueue

    5.4.2   并发对象

           在某些系统中,对象并发执行,每一个对象有一条自己的控制线程,如果系统使用,则通过激活、异步消息和活动对象来表示,第8章会讨论

    5.4.3   定义迭代和约束的标签

           在对象图的左边和右边可以有标签和注释。一般,循环就是使用边缘注释来描述的

    如上图,用来指定时间约束的标签。ab之间的时间间隔不能大于5秒,PrintServer发送的消息Print必须在1秒内收到,下斜的箭头表示发送和接收消息之间的时间间隔是足够的

    5.4.4   创建和破坏对象

           在序列图上可以描述如何创建和破坏对象,并把它作为描述情节的一部分。被创建的对象的对象符号放在创建它的地方(在纵坐标时间轴上),当一个对象被破坏后,用“X”标示,同时说明,对象的生命线只需画到对象破坏时为止

    Customer对象创建一个Customer类的新的对象,使用DeteleCustomer操作来破坏customer对象

    5.4.5   递归

           当一个操作调用它自己时就是递归,消息总是同步的

           如上图,Oper()操作调用其本身,操作中必须有一个停止递归的条件

    5.5   协作图

           协作图(Collaboration Diagram)主要描述协作对象间的交互和连接(一条连接就是一个关联的实例化)。序列图和协作图都描述交互,但序列图强调时间,协作图强调空间

    如图,actor发送Print消息给ComputerComputer发送一个Print消息给PrintServer,如果打印机空闲,PrintServer就发送Print消息给Printer

    5.5.1   消息流

           协作图中的消息标签语法规则:

                  前缀 守卫条件 序列表达式 返回值 := 说明

           其中前缀描述为:       序列号 ‘,’ … ‘/’

           例子如下:

                  1: display()

                  [mode=display] 1.2.3 .7: redraw()

                  2  *[n:=1…z] : prim := nextPrim(prim)             表示循环

                  3.1 [x<0] : foo()

                  3.2 [x=>0] : foo()

                  1.1a , 1.1b/1.2 : continue()

    5.5.2   链接

           一条链接是两个对象之间的连接,链接上的任何对象的角色名均作为链接的端点,与链接的量词在一起

    l         Global:加在链接角色上的约束,说明与对象对应的实例是可见的,因为它在全局范围内

    l         Local:说明与对象对应的实例是可见的,因为它是操作中的一个局部变量

    l         Parameter:同上,因为它是操作中的一个参数

    l         Self:说明一个对象可以给自己发送消息

    l         Vote:这个是加在消息上的约束,限制一组返回值

    l         Broadcast:加在一组消息上的约束,说明消息不按一定的顺序激活

    5.5.3   对象生命周期

           在给一个协作指派一个{new}期间,对象被创建;在给一个协作指定约束{destroyed}期间,对象被破坏;如果给协作指定{transient},则对象被创建和破坏

    如上图,有关一个角色按下一个按钮让电梯达到他想去的楼层的协作图;电梯控制对象检查所有电梯的工作队列的长度并选择一个最短的。然后,它创建一个作业命令对象并将它放入到队列激活它,电梯对象并发运行并从它的队列中选取一个作业

    如上图,对象MainWindow收到消息NewCustomer,创建Customer,然后将Customer对象传递给CustomerWindow,从而实现客户数据更新

    5.5.4   使用协作图

    这是一个更为复杂的协作图,一个Sales Statistics windows(消息1),创建一个Statistics Summary对象(1.1),该对象收集统计信息显示在窗口中,当此对象被创建后,它不断地循环得到推销员的订单( 1.1.1 )和预算(1.1.2),第一个Salesperson对象得到它的所有订单(1.1.1.1),加它们加在一起,从BudgetSales对象得到预算(1.1.2.1),创建完成(消息1.1返回),然后Sales Statistics Window对象从Statistics Summary对象得到结果行(消息1.2)并将每一行显示在窗口上,协作完成

    5.6   活动图

           活动图(activity diagram)显示动作及其结果。它着重描述操作(方法)实现中所完成的工作以及用例实例或对象中的活动,主要目的是描述动作(执行的工作和活动)及对象状态改变的结果,其目的还有:

    l         描述一个操作执行过程中(操作实现的实例化)所完成的工作(动作)

    l         描述对象内部的工作

    l         显示如何执行一组相关的动作,以及这些动作如何影响他们周围的对象

    l         显示用例的实例是如何执行动作以及如何改变对象状态

    l         说明一次商务活动中的工人(角色)、工作流、组织和对象是如何工作的

    5.6.1   动作和转移

           可以将一个转移分解成两个或更多的转移,从而导致并发的动作

    在第二和第三个动作间的转移带有一个发送短句,表示发送Print(file)消息给Printer对象

           初始化完成后,并发两个操作:更新显示和测量

    5.6.2   泳道

           泳道用来组织活动,根据活动的功能来组合,几个目的:直接显示动作在哪一个对象中执行,或显示执行的是一项组织工作的哪一个部分

    结合上图,动作更新显示在Displayer内执行,动作初始化和测量在Sampler内执行

    5.6.3   对象

           测量动作给更新显示动作提供测量值(测量值是一个对象)

    5.6.4   信号

           在创建postscript文件与删除消息框之间,Print信号被发送,信号带有参数file,代表Printer对象收到并打印文件

    5.6.5   运用活动图进行商业建模

           在商业建模时,几个方面是模型着重描述的:资源规则目的动作(工作流),两类资源:物质信息

    5.7   小结

     

    最新回复(0)