UML简介

UML(United Modeling Language)统一建模语言,一种基于面向对象的可视化建模语言

UML采用一组形象化的图像(如类图)符号作为建模语言,是这些符号可以形象地描述系统的各个方面
UML通过建立图形之间的各种关系来描述模型!

UML工具

我在学习中使用的是StarUML,这是一款开源免费的UML图绘制工具,点击这里即可下载,当然在有一些其他的UML工具,比如RationalRose 、PowerDesigner 等等不在此一一赘述!

软件工程生命周期

软件工程可以分为三个大阶段:需求、设计、测试与维护

一、需求:开发目标、可行性分析、需求分析

二、设计:概要设计、详细设计、编码与单元测试

三、测试与维护:综合测试、维护

一般来说,软件开发生命周期可以使用PDCA来概述:

  • P(Plan)——软件规格说明,规定软件的功能及其运行时的限制。
  • D(DO)——软件开发,开发出满足规格说明的软件。
  • C(Check)——软件确认,确认开发的软件能够满足用户的需求。
  • A(Action)——软件演进,软件在运行过程中不断改进以满足客户新的需求。

从软件开发的观点看,它就是使用适当的资源(包括人员,软硬件资源,时间等),为开发软件进行的一组开发活动,在活动结束时输入(即用户的需求)转化为输出(最终符合用户需求的软件产品)

UML中的10种图

静态模型图

描述系统的静态结构

  • 类图
  • 对象图
  • 包图
  • 组件图
  • 部署图

动态模型图

描述系统行为的各个方面

  • 用例图

  • 时序图

  • 协作图

  • 状态图

  • 活动图

UML中的关系

UML中的关系主要是包括四种:
关联关系(association)
依赖关系(dependency)
泛化关系(generalization)
实现关系(realization)

用例图 UseCase Diagram

用例图(Use Case Diagram):也称为用户模型图,是从软件需求分析到最终实现的第一步,它是从客户的角度来描述系统功能

用例图包括3个基本组件:参与者(Actor)、用例(Use Case)、关系

  • 参与者:与系统打交道的人或者其他系统即使使用该系统的人或者事物,在UML中参与者用人形图标表示
  • 用例:代表系统的某项完整的功能,在UML中使用一个椭圆来表示
  • 关系:定义用例之间的关系……泛化关系、扩展关系、包含关系

相关操作:右键添加各种图像,通过文件导出为图像

用例关系 —— 泛化关系 Generalization

泛化关系:表示同一业务目的(父用例)的不同技术实现(各个子用例),在UML中,用例泛化用一个三角箭头从子用例指向父用例

用例关系 —— 包含关系

一个用例可以包含其他用例的行为,并把它包含的用例行为作为自身行为的一部分,在UML中包含关系用虚线箭头+《include》,箭头指向被包含的用例

用例关系 —— 拓展关系

如果在完成某个功能的时候偶尔会执行另外一个功能,则用拓展关系表示,在UML中拓展关系用虚线箭头+《extend》,箭头指向被拓展的用例

用例图的小练习

下面是关于一个公司的人事管理系统的需求的简单描述,建立其相应的用例模型:该人事管理系统的用户是公司的人事管理干部.该系统具有人事档案库, 保存员工的人亊信息,包括姓名,性别,出生年月,健 康状况,文化程度,学位,职称,岗位,聘任时间,任期 ,工资,津贴,奖罚记录,业绩,论著和家庭情况等,系统提供的基本眼务有人事信息的管理,包括人事规定的权调动与聘任,职称评定,奖罚等,并且可以按照限查询人事信息,生成与输出统计报表等.该人事系统每月向公司的财务系统提供员工的工资,津贴等数据.

类图 Class diagram

  • 类图是面向对象建模中常用的图,是定义其他图的基础
  • 类图主要是用来显示系统中的类,接口以及它们之间的关系
  • 类图包含的主要元素有类,接口和关系,其中关系包括:泛化关系、关联关系、依赖关系和实现关系,在类图中也可以包含注释和约束

类图的表示法

类是类图的重要组件,由三部分组成:类名、属性和方法

在UML中类用矩形表示,顶端存放类名,中间存放类的属性(属性的类型及值),底部存放类的方法(方法的参数和返回值类型)

在UML中可以根据实际情况有选择的隐藏属性部分和方法部分或者两者都隐藏

在UML中公有(public)的东西使用+表示,私有(private)的东西使用-表示,保护(protected)的东西使用#表示,UML工具的开发者也可以自定义符号来表示

属性的完整表示方式:可见性 名称 :类型 [ = 缺省值] 中括号中的内容表示是可选的,例如下图所示的类图:

接口的表示法

接口中包含方法,但是不包含属性,在UML中接口用一个带有名称的圆圈表示,并且通过一条实线与它的模型元素相连,但是有时候接口也用普通类的矩形符号表示:

类与类关系——泛化关系 Generalization

在UML中泛化关系用来表示类与类、接口与接口之间的继承关系,泛化关系有时也称为:is a kind of关系

在UML中泛化关系用一条实线空心箭头由子类指向父类

类与类关系——依赖关系 Dependency

以下面的代码作为例子,假设Person类一个对象上班需要乘客车,或者这个对象是卖客车的,那么Person类就与Car类产生联系,这种联系就叫做依赖关系:

1
2
3
4
5
6
7
8
9
class Car{ };
class Person{
public:
//上班乘车
void GoToWork(Car& car){ }

//卖车
Car& SellCar(){ }
};

类与类关系——关联关系 Association

关联关系很好理解,借助上面的例子,原来Person对象是做客车去上班,关联关系就可以理解为这次Person对象是开私家车去上班!

两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间应该是关联关系,意思就是:一个类是另一个类的成员变量,例如:订单与客户之间的关系,每个订单对应着特定的客户,每个客户对应着特定的订单!

1
2
3
4
5
6
7
8
9
10
11
12
class Car{
public:
void run(){ };
};
class Person{
public:
void GoWork(){
myCar.run();
};
private:
Car myCar;
};

关联关系的多重性

关联关系的多重性是指有多少个对象可以参与该关联,多重性可以用来表达一个取值范围,特定值,无限定值的范围:

表示法 说明 表示法 说明
0 表示0个对象 1..n 表示1-n个对象
0..1 表示0-1个对象 n 表示n个对象
0..n 表示0-n个对象 * 表示许多对象
1 表示一个对象

关联关系——聚合 Aggregation

这个比较简单,这好比一辆汽车可以选择很多型号和品牌的发动机

  • 聚合关系是关联关系的一种是更强的关联关系
  • 聚合是整体和部分之间的关系,例如:电脑由CPU、内存、输出输出设备组成
  • 聚合关系也是通过成员变量实现的,但是关联关系所涉及的两个类处于同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分

聚合使用 空心菱形+实线表示

关联关系——组合 Composition

如果是聚合关系是一辆汽车可以选择很多型号和品牌的发动机,那么组合关系联系就更加紧密了,这就好比人和自己的五脏六腑,生命周期一致的缺一不可!

  • 在UML中组合关系是一种关联关系,是一种比聚合还要强的关系
  • 代表整体的对象负责代表部分对象的生命周期
  • 组合更加强调生命周期的一致性

组合使用 实心菱形+实线表示

类图的小练习

汽车和自行车都是交通工具(vehicle),一辆自行车(bicycle)只归一个人(person)所有,但是一辆汽车(auto)可以归一个人或者两个人所有,一个人可能没有自行车或者汽车,也可能有多辆自行车或者汽车,人分为男人(male)和女人(female),每个人都有年龄(age)和名字(name),每辆交通工具都有自己的颜色(color)和商标(brand),每辆汽车都有两个前灯(headlight)和一台发动机(motor)

对象图 Object Diagram

  • 对象图是类图的一个实例,用于显示系统执行时的一个可能的快照,即在某一时间上系统可能出现的样子,对象图用带下划线的对象名称来表示对象
  • 表现对象的特征
  • 对象图展现了多个对象的特征以及对象之间的关系

下面是一个Person对象使用MacBook Pro对象和ASUS_Windows的示例:

时序图 Sequence Diagram

  • 时序图用于描述对象之间的消息传递的时间顺序,即用例中的行为顺序
  • 当执行一个用例时,时序图的每条消息对应了一个类操作或者引起转换的触发时间
  • 在UML中,时序图表示为一个二维的关系图,其中纵轴是时间轴,时间沿竖线向下延伸。横轴代表在协作中各个独立的对象,当对象存在时,生命线用一条虚线表示消息从一个对象的生命线到另一个对象生命线的箭头表示,箭头以时间的顺序在图中上下排列

时序图基本概念

对象

时序图中对象使用矩形表示,并且对象名称下有下划线,将对象至于时序图的顶部说明在交互开始时对象就已经存在了,如果对象的位置不在顶部表示对象实在交互的过程中被创建的

生命线

生命线是一条垂直的虚线,表示时序图中对象在一段生命周期内的存在,每个对象底部中心位置都带有生命线

消息

两个对象之间的单路通信,从发送方指向接收方,在时序图中很少使用返回消息

时序图练习

关于登录的时序图的练习:

活动图 Activity Diagram

在UML中,活动图本质上就是流程图,它用于描述系统的活动,判定点,分支等等

活动图基本概念

动作状态

原子的,不可中断的动作,并在此动作完成之后向另一动作转变,在UML中动作状态用圆角矩形表示,动作状态所表示的动作卸载圆角矩形的内部

分支与合并

分支在软件系统中很常见,一般用于表示对象所具有的条件行为。用一个布尔表达式的真假来判断动作的流向,条件行为用分支和合并表达。在活动图中,分支用空心小菱形表示,分支包括一个入转换和两个带条件的出转换,出转换的条件应该是互斥的,须保证只有一条出转换能够被触发,合并两个带条件的入转换和一个出转换

分叉与汇合

分叉用来描述并发线程,每个分叉可以有一个输入转换和两个或多个输出转换,每个转换都可以是独立的控制流,汇合代表两个或者多个并发控制流同步发生,当所有的控制流都达到汇合点后,控制才能继续往下进行,每个汇合可以有两个或多个输入转换和一个输出转换,在UML中分叉和汇合用一条粗直线表示

泳道

泳道将活动图的活动划分为若干组,并将每一组指定给负责这组活动的业务组织,泳道区分负责活动的对象,明确的表示是哪些活动是由哪些对象进行的。每个活动制定明确的属于一个泳道,在活动图中,泳道用垂直的实线绘出,垂直线分割的区域即为泳道

活动图练习


某公司销售人员接到订单后,将订单传给财务人员和 仓库人员.财务人员开具发票,并收款。仓库人员准备货物,并查看是否货物加急,葙是加急采用EMS方式发货,否则采用普通包裹方式发货.完成之后由销售人员关闭该订单.根据上面描述画出该公司销售过程的活动图:

状态图 Statechart Diagram

状态图通过建立对象的生命周期模型来描述对象随时间变化的动态行为!

状态图基本概念

状态

用圆角矩形表示,状态名称表示状态的名字, 通常用字符串表示,一个状态的名称在状态图所在的
上下文中应该是唯一的.

转换

用带箭头的直线表示,一端连着源状态,一端连着目标状态.

初始状态

每个状态图都有一个初始状态,此状态代表状态图的起始位置,初始状态只能作为转换的源,
不能作为转换的目标,并且在状态图中只能有一个。初始状态用一个实心圆表示.

终止状态

模型元素的最后状态,是一个状态图的终止点,终止状态在一个状态图中可以有多个

状态图的练习

下面是Linux进程状态图的练习,当然不是很详细,像僵尸状态没有画出来:

协作图 Collaboration Diagram

协作图(也叫作合作图、通信图)是一种交互图

时序图主要侧重于对象间消息传递在时间上的先后关系,而协作图表达对象之间的交互的过程以及对象之间的关联关系,时序图跟协作图可以相互转化,不难理解,协作图的构成有角色,对象,连接,消息。具体含义同时序图。

协作图表现的是对象在空间上的联系,所以不存在时序图中的生命线和激活器

协作图是动态图的另一种表现形式

  • 强调参加交互的各对象结构的信息
  • 是一种类图,包含各类元角色和关联角色,而不仅仅是类元和关联
  • 强调参加交互的各对象的组织
  • 协作图可以被视为对象图的扩展

    协作图的练习

包图 Package Diagram

包图由包和包之间的关系组成,包的图标就如同一个带标签的文件夹

  • 维护和控制系统总体结构的重要建模工具
  • 方便理解和处理整个模型
  • 设计良好的包是高内聚、低耦合的,并对其内容的访问具有严密的控制

包提供了一种用于组织各种元素的分组机制,在UML中,包用来对元素进行分组,并为这些元素提供命名空间,包所拥有的或者引用的所有元素称为包的内容,包没有实例

组件图 Component Diagram

组件图用来建立系统中各组件之间的关系,各组件通过功能组织在一起

构件图 = 构件(Component)+接口(Interface)+关系(Relationship)+端口(Port)+连接器(Connector)

JavaBean、ejb、jsp都是组件,在UML中,组件使用左侧有个两个小矩形的的大矩形来表示

组件图可以用来设计系统的整体框架

部署图 Deployment Diagram

部署图用来帮助开发者了解软件中的各个组件驻留在什么硬件位置,以及这些硬件之间的交互关系。使用部署图可以显示运行时系统的结构,同时还传达构成应用程序的硬件和软件元素的配置和部署方式。

节点:用来表示一种硬件,可以是打印机,计算机等。节点的标记符号是一个三维框,在框的左上方包含 了节点的名称。包括节点的表示,节点的分类,节点中的构件,节点属性,节点与构件。

节点分类

  • 处理器(Processor),处理器是能够执行软件、具有计算能力的节点。
  • 设备(Device) :设备是没有计算能力的节点,通常情况下都是通过其接口为外部提供某种服务,例如打印机、IC读写器,如果我们的系统不考虑它们内部的芯片,就可以把它们看作设备

通信关联

节点通过通信关联建立彼此的关系,采用从节点到节点绘制实线来表示关联,对于企业的计算机系统硬件设备间的关系,但是通常关心的是节点之间是如何连接的,因此描述节点间的关系一般不使用名称,而是使用构造型描述