UML 概述
统一建模语言(Unified modeling Language,UML),UML 是一种编制软件蓝图的标准化语言,他的目标就是为开发团队提供标准通用的设计语言来开发和构建计算机应用。通过使用UML,开发人员能够阅读和交流系统架构和设计规划。UML支持面向对象的技术,能够准确的方便地表达面向对像的概念,体现面向对象的分析和设计风格.
UML 模型的组成
UML 模型有三大组成部分,分别为事物、关系以及图。
事物(Things)
UML 类符号表示:

类使用3层矩形表示,其中:
- 第一行表示类的名称,如果是抽象类,使用斜体显示
- 第二层表示字段和属性
- 第三层表示方法
注意:+ 表示 public,- 表示private,# 表示protected
关系(Relationships)
泛化
类的继承结构在 UML 模型中分别表现为泛化(generalize)与实现(realize)。
泛化(继承)关系使用一条带有空心箭头的实线来表示。例如,Windows 继承 Computer 表示为:

实现关系使用一条带有空心箭头的虚线来表示。例如:Phone 实现 IPower 表示为:
关联
关联表示一种结构关系,它指明一个事物的对象与另一个事物的对象间的联系。它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;例如:学校与学生就是一种关联关系。
关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,表示非箭头知道箭头一端,箭头一端不知道非箭头一端。如下图,表示A知道B,但 B不知道A;

一般的关联关系如下:

多重关联关系:
| 表示方式 | 多重性说明 |
|---|---|
| 1..1 | 一对一的关系 |
| 0..* | 表示可以持有另一个类零个或多个对象 |
| 1..* | 表示可以持有另一个类一个或多个对象 |
| 0..1 | 表示可以持有另一个类零个或一个对象 |
| m..n | 表示可以持有另一个类最少m个,最多n个对象 |
聚合
聚合关系强调是“整体”包含“部分”,但是“部分”可以脱离“整体”而单独存在。使用带空心菱形的直线表示。如下图,Computer 和 Display 就是聚合关系,Computer 包含了 Display,而 Display 可以脱离 COmputer 单独存在。

组合
组合关系也是强调整体与部分的关系,但是在组合关系中,部分不能脱离整体而存在。使用带实心菱形的执行表示。如下图,Head 和 Mouth 就是组合关系,Mouth 不能脱离 Head 而存在。

依赖
表示两个事物之间的语义关系,其中一个事物(独立事物)发生变化, 会影响到另一个事物(依赖事物)。使用带箭头的虚线表示。如下图所示:Developer 的 develop() 方法要传入一个 AndroidStudio 对象才能发挥作用,因此 Developer 依赖于 AndroidStudio。
泛化主要表示继承和实现的关系;
关联、聚合/组合都表示两个类之间的关系,简单地说,表示为一个类作为另一个类类型的成员变量。不同的是,关联关系表示两个类是同级的,没有包含关系;聚合/组合更强调整体与部分的关系; 依赖关系也表示两个类之间的关系,只不过通常以方法参数的形式出现。
图(Diagrams)
类图
类图描述系统所包含的类、类的内部结构及类之间的关系的静态视图,它包括:类、接口、关联和协作。类图的目的可概括为:
- 分析和设计应用程序的静态视图
- 描述一个系统的责任
- 基地组件图和部署图
- 正向和逆向工程
画类图需要牢记以下几点:
- 类图中的名称应该是有意义的描述,并且是面向系统的
- 画类图前应先确定每个元素之间的关系
- 类图中的每个类职责(属性和方法)应该清晰标明
- 对于每个类的属性的最小数量应符合规定,不必要的属性将使图表复杂
对象图
UML 对象图和类图一样反映系统的静态过程,但它是从实际的或原型化的情景来表达的,显示某时刻对象和对象之间的关系。由于对象存在生命周期,因此UML对象图只能在系统某一时间段存在。对象图的目的可概括为:
- 正向和逆向工程。
- 一个系统的对象间的关系
- 一个交互的静态视图。
- 了解对象的行为和他们的关系从实用的角度来看
为了捕捉一个特定的系统,类图的数量是有限的。但是,如果我们考虑对象图,那么我们就可以有无限数量的实例在本质上是独一无二的。因此,只有这些情况下被认为是对系统的影响。
从上面的讨论,很显然,一个单一的对象图不能捕获所有必要的实例,而不能指定一个系统的所有对象。因此,解决方案是:
- 首先,分析系统,并决定哪些情况下有重要的数据和关联
- 其次,只考虑那些实例将涵盖功能
- 第三,做一些优化实例的数量是无限的
绘制对象图之前,应该记住以下事情,并清楚地理解:
- 对象图的主要内容是对象
- 对象图中的链接是用来连接对象
- 对象和链接的两个要素,用于构造一个对象图
在开始构建图前,下列事项要明确:
- 对象图的名称要有意义,以表明其目的
- 最重要的要素是要确定
- 对象之间的关联,应该予以明确
- 不同元素的值需要捕获包含在对象图
- 添加适当的注释,需要更清晰点
组件图
UML 组件图(Component Diagram)又称为构件图,他描述的是在软件系统中遵从并实现一组接口的物理的、可替换的软件模块。
组件图 = 构件**(Component)**+ 接口**(Interface)**+ 关系**(Relationship)**+ 端口**(Port)**+ 连接器**(Connector)**
UML 组件图提供了将要建立的系统的高层次的架构视图,帮助开发者开始建立实现的路标,并决定关于任务分配及(或)增进需求技能。
组件图不描述该系统的功能,但它描述了用于使这些功能的组件。所以从这一点来说,组件图用于可视化在一个系统中的物理组件。这些组件包括库,程序包,文件等。一个单一的组件图不能代表整个系统,但图的集合可用以。组件图的目的概括如下:
- 可视化系统的组成部分
- 构建的可执行文件,使用正向和反向工程
- 描述的组织和组件的关系
组件图是用来描述一个系统的物理构件
构件是现成的组件图是用来得到一个想法的实现
用例图
用例图捕捉了模拟系统中的动态行为,并且描述了用户、需求以及系统功能单元之间的关系,展示了一个外部用户能够观察到的系统功能模型图。用例图由主角,用例和它们之间的关系组成。用例图的目的概括如下:
- 收集系统的要求
- 获取系统的外观图
- 识别外部和内部因素影响系统
- 显示要求之间的相互作用是参与者
用例图被认为是高层次的需求分析系统。参与者可以是人的用户、一些内部的应用程序,或可能会有一些外部应用程序。因此,一个用例图中应该有以下项目:
- 参与者
- 功能被表示为一个用例
- 用例和参与者之间的关系

这是一个订单管理系统,其中有3个用例:订单、特殊订单和普通订单,还有一个参与者:顾客。SpecialOrder 和 NormalOrder 是 Order 的扩展。参与者是系统的外部用户。
交互图
UML 交互图描述的是对象之间的动态合作关系以及合作过程中的行为次序,常常用来描述一个用例的行为,显示该用例中所涉及的对象以及这些对象之间的消息传递情况,即一个用例的实现过程。交互图又分为时序图和协作图。
- 时序图:显示对象之间的关系,强调对象之间消息的时间顺序,显示对象之间的交互
- 协作图 :描述对象之间的交互关系
UML 交互图主要包括对象和消息两类元素,创建交互图的过程实际上就是向对象分配任务的过程,是可视化系统的交互行为。由于可视化的交互是一个困难的任务,所以要使用不同类型的模型来捕获不同方面的相互作用,这也是序列图和时序图的作用。
- 捕捉一个系统的动态行为
- 描述该系统中的消息流
- 描述对象的结构组织
- 描述对象之间的互动
在绘制交互图之前,确定以下条件:
UML 状态图是图表本身的名称,主要用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。
状态机由状态、转换、事件、活动和动作五部分组成:
- 状态:状态指的是对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。一个状态的生命周期是一个有限的时间阶段。
- 转换:转换指的是两个不同状态之间的一种关系,表明对象在第一个状态中执行一定的动作,并且在满足某个特定条件下由某个事件触发进入第二个状态。
- 事件:事件指的是发生在时间和空间上的对状态机来讲有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态,如信号、对象额度创建和销毁等。
- 活动:活动指的是状态机中进行的非原子操作。
- 动作:动作指的是状态机中可以执行的哪些原子操作。所谓原子操作,指的是他们在运行的过程中不能被其他消息中断,必须一直执行下去,以至最终导致状态的变更或者返回一个值。
UML 状态图可以捕获对象、子系统和系统的生命周期,可以告知一个对象可以拥有的状态,并且事件(如消息的接收,时间的流逝、错误、条件为真等)会怎样随着时间的推移来影响这些状态。一个状态图应该连接到所有具有清晰的可标志状态和复杂行为的类;该图可以确定类的行为以及该行为如何根据当前的状态而变化,也可以展示哪些事件将会改变类的对象的状态。状态图主要是为了模拟响应系统,其目的可概括为:
- 为了模拟系统的动态环节
- 反应系统模型生命周期
- 一个对象来在其生命周期的时间内描述为不同的状态
- 定义一个状态机模型状态的对象
状态图是用来描述不同的对象在其生命周期的状态。因此,强调的是一些内部或外部事件的状态发生变化时,这些对象的状态要重要的分析和准确的贯彻落实。状态图描述的状态是非常重要的。对象的状况,当发生特定事件时,可以被确定为状态。绘制状态图之前,我们必须明确以下几点:
- 识别对象,以进行分析
- 识别状态
- 识别的事件
一个状态图(Statechart Diagram)本质上就是一个状态机,或者是状态机的特殊情况,它基本上是一个状态机中元素的一个投影,这也就意味着状态图包括状态机的所有特征。状态图描述了一个实体基于事件反映的动态行为,显示了该实体是如何根据当前所处的状态对不同的事件作出反应的。
