UML核心技术学习(五)

原创 2007年10月16日 00:57:00

第五章       动态建模

       所有系统均可表示为两个方面:静态结构动态行为类图(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   小结

 

深度学习核心技术

核心技术 Core Tech 人脸检测 Face Detection Linkface 开发了基于深度学习的人脸检测创新算法 。无论场景中是单人或多人,还是侧脸、半遮挡、模糊等情景中...
  • starzhou
  • starzhou
  • 2016年04月03日 19:20
  • 741

人工智能的五大核心技术

计算机视觉、机器学习、自然语言处理、机器人和语音识别是人工智能的五大核心技术,它们均会成为独立的子产业。   计算机视觉     计算机视觉是指计算机从图像中识别出物体、...
  • sergeycao
  • sergeycao
  • 2017年07月17日 16:40
  • 407

我的UML建模学习(一)

公司比较清闲,平时大部分时间都在学习,哦,不是大部分,是整天都在自己学习,最近一直对建模语言感兴趣,所以就自己各方找资料。开始是看视频,看了一个小时,感觉效果不大,然后开始反思效果不大的原因。这是我自...
  • qq_29206465
  • qq_29206465
  • 2016年04月27日 11:42
  • 1337

【UML学习】构件图和部署图

说明:系统体系结构可以分为软件体系结构模型和硬件体系结构模型,用构件图和部署图进行两种系统体系结构的描述。在UML中用构件图描述各种软件构件之间的依赖关系,如可执行文件和源文件之间的依赖关系,所设计的...
  • tigaoban
  • tigaoban
  • 2016年11月22日 15:21
  • 571

uml的学习--书籍

http://maosea0125.blog.163.com/blog/static/212531242007422104241694/   uml真正有用的书5本足以,学习流程如下: 《UML...
  • imxiangzi
  • imxiangzi
  • 2016年03月11日 23:42
  • 1538

关于UML学习的总结

关于UML学习的总结UML的组成 : 四种事物:构建事物,行为事物,分组事物,注释事物。 四种关系: 泛化(是一般事物(父类)与该事物的较为特殊的种类(子类)之间的关系)【带有空心箭头的实线,实线...
  • zhaojianyin
  • zhaojianyin
  • 2017年04月12日 20:59
  • 447

UML学习总结/

UML学习结束了。通过这一阶段的学习,了解了什么是UML以及UML的功能 一、UML是什么 1、uml承袭面向对象分析与设计的方法,是用于描述系统蓝图的标准模式语言。 2、它不是编程语言。uml是一种...
  • wangyy130
  • wangyy130
  • 2014年03月10日 20:38
  • 1401

UML学习之:类图

UML学习之:类图 1.关于UML     回顾20世纪晚期--准确地说是1997年,OMG组织(Object Management Group对象管理组织)发布了统一建模语言(Unified Mod...
  • ziyuanxiazai123
  • ziyuanxiazai123
  • 2013年09月28日 15:37
  • 1475

《java多线程编程核心技术》读书笔记1

第一章:java多线程技能 在学习线程之前我们首先要清楚一下进程的概念:            进程是操作系统结构的基础,是系统进行资源分配的和调度的独立单位。window...
  • GODBAR
  • GODBAR
  • 2016年09月03日 08:15
  • 742

UML建模学习1:UML统一建模语言简介

一什么是UML?         Unified Modeling Language(UML又称为统一建模语言或标准建模语言)是国际对象管理组织OMG制定的一个通 用的、可视化建模语言标准,可以用来描...
  • erlian1992
  • erlian1992
  • 2016年04月16日 20:33
  • 8565
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UML核心技术学习(五)
举报原因:
原因补充:

(最多只允许输入30个字)