统一建模语言UML(Unified Modeling Language)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。

UML定义了5类,10种模型图:

1.用例图:从用户角度描述系统功能,并指各功能的操作者。
2.静态图:包括类图,包图,对象图。
   类图:描述系统中类的静态结构
   包图:是包和类组成的,表示包与包之间的关系,包图描述系统的分层结构
   对象图:是类图的实例
3.行为图:描述系统动态模型和对象组成的交换关系。包括状态图和活动图
   活动图:描述了业务实现用例的工作流程
   状态图:是描述状态到状态控制流,常用于动态特性建模
4.交互图:描述对象之间的交互关系
   顺序图:对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互
   合作图:描述对象之间的协助关系
5.实现图:
   配置图:定义系统中软硬件的物理体系结构

UML的目标是以面向对象图的方式来描述任何类型的系统,具有很宽的应用领域。其中最常用的是建立软件系统的模型,但它同样可以用于描述非软件领域的系统,如机械系统、企业机构或业务过程,以及处理复杂数据的信息系统、具有实时要求的工业系统或工业过程等。总之,UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模。

此外,UML适用于系统开发过程中从需求规格描述到系统完成后测试的不同阶段。在需求分析阶段,可以用用例来捕获用户需求。通过用例建模,描述对系统感兴趣的外部角色及其对系统(用例)的功能要求。分析阶段主要关心问题域中的主要概念(如抽象、类和对象等)和机制,需要识别这些类以及它们相互间的关系,并用UML类图来描述。为实现用例,类之间需要协作,这可以用UML动态模型来描述。在分析阶段,只对问题域的对象(现实世界的概念)建模,而不考虑定义软件系统中技术细节的类(如处理用户接口、数据库、通讯和并行性等问题的类)。这些技术细节将在设计阶段引入,因此设计阶段为构造阶段提供更详细的规格说明。

编程(构造)是一个独立的阶段,其任务是用面向对象编程语言将来自设计阶段的类转换成实际的代码。在用UML建立分析和设计模型时,应尽量避免考虑把模型转换成某种特定的编程语言。因为在早期阶段,模型仅仅是理解和分析系统结构的工具,过早考虑编码问题十分不利于建立简单正确的模型。

UML模型还可作为测试阶段的依据。系统通常需要经过单元测试、集成测试、系统测试和验收测试。不同的测试小组使用不同的UML图作为测试依据:单元测试使用类图和类规格说明;集成测试使用部件图和合作图;系统测试使用用例图来验证系统的行为;验收测试由用户进行,以验证系统测试的结果是否满足在分析阶段确定的需求。

总之,标准建模语言UML适用于以面向对象技术来描述任何类型的系统,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。

本文主要介绍状态图和活动图。

一.状态图

状态(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.状态的类型

①按状态过程分:

②含有子状态的状态被称为组合或嵌套状态

组合状态可以使用“与”关系分解为并发子状态,或者通过“或”关系分解为互相排斥的顺序子状态。两种表示方法:
顺序子状态
如果一个组成状态的子状态对应的对象在其生命期内的任何时刻都只能处于一个子状态,即多个子状态之间是互斥的,不能同时存在,这种子状态称为顺序子状态。


并发子状态
有时组合状态有两个或者多个并发的子状态机,此时称组成状态的子状态为并发子状态。

历史状态是伪状态, 其目的是记住从组合状态中退出时所处的子状态, 当再次进入组合状态时, 可以直接进入这个子状态, 而不是再从组合状态的初态开始。

浅(shallow)历史状态, 只记住最外层组合状态的历史。

深(deep)历史状态, 可以记住任意深度的组合状态的历史。

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.活动图与状态图的区别:
①描述对象不同

状态图:描述对象状态及状态之间的转移;
       活动图:描述从活动到活动的控制流。

②使用场合不同

状态图:描述对象在其生命期中的行为状态变化;
       活动图:描述过程的流程变化。

转自:https://www.cnblogs.com/jingwhale/p/4230235.html

最新文章

  1. 2016苹果春季发布会 iPhone SE发布
  2. 怎么让我们自己开发的Android程序设为默认启动
  3. otter双主同步安装与配置
  4. 在ubuntu上配置nginx+php+mysql+phpmyadmin
  5. js024-最佳实践
  6. phpDocumentor 注释语法详解
  7. Check list
  8. 《转》GDB中应该知道的几个调试方法
  9. IT项目管理的六种错误思维
  10. ajax+php如何获取部分请求的信息显示在对应的div中
  11. Jenkins+SonarQube代码质量检查自动化
  12. asp.net core mvc剖析:mvc执行过程(一)
  13. cc.Lable组件,RichText组件,AudioSouce组件的使用
  14. binlog2sql实现MySQL误操作的恢复
  15. Qt Ubuntu 编译出错-1: error: 找不到 -lGL
  16. C++ 求最长递增子序列(动态规划)
  17. mysql 字符串数值计算 精度丢失
  18. 【BZOJ5306】 [Haoi2018]染色
  19. 3.Decorator Pattern(装饰者模式)
  20. 【Leetcode】535. Encode and Decode TinyURL

热门文章

  1. 比较Fink, macports 跟 homebrew
  2. Lintcode400 Maximum Gap solution 题解
  3. 提高Maven下载jar包的速度
  4. System.Drawing.image 与ImageSource 互转
  5. (汇总)os模块以及shutil模块对文件的操作
  6. lambda隐藏函数的嵌套
  7. Python 基础【一】
  8. Shell脚本中获取select值
  9. 接口调用(发送http请求)
  10. spring中@Resource和@Autowired理解