UML建模
前言
UML建模资料已经很多了,有人想用有人不用,有人会用也有人不会用,本文只是作者的一篇UML建模总结,不想去写太细,因为真正的你去用下,去画下就基本都会了。工具毕竟是工具,设计和思想才最重要。
Enterprise Architect简介
Enterprise Architect(简称EA) 是Sparx Systems 公司推出的UML建模工具。
它支持模型驱动的软件开发全生命周期工作。适合项目经理:有效地管理项目、业务分析师:业务需求战略分析、开发人员:建立和开发系统和测试人员:测试和调查使用。
它主要功能包括:UML建模、SysML 建模、BPMN建模、模型仿真、应用程序执行与调试、双向代码工程、需求管理、项目管理、版本管理、测试点管理等等,并且能够生成 PDF格式、 RTF格式和html格式的文档报告。
注:本文使用Enterprise Architect建模工具进行UML建模介绍,不过分去介绍Enterprise Architect建模工具本身,只借助工具来完成和讲解下UML建模的过程,旨在指导大家进行UML建模的设计。
UML简介
UML(Unified Modeling Language)又称统一建模语言或标准建模语言,它是一个用于沟通、 建模、 指定和定义系统的可视化语言,为软件开发的所有阶段提供模型化和可视化支持。
UML 图主要分两种:
· 结构图:描绘结构元素构成的系统或函数,显示结构或运行时体系结构的静态关系
· 行为图:描绘一个系统或业务过程的行为特征,显示动态模型的视图。
结构图包括下面的图表类型:
图类型 |
详细 |
类图 |
类图捕获系统的逻辑结构、 类和对象描述它存在哪些属性和行为。 |
复合结构图 |
复合结构图反映类、 接口和组件的内部合作 (和它们的属性) 来描述它的功能。 |
组件图 |
组件图说明了软件块、 嵌入的控制器等构成了一个系统,其组织和依赖关系。 |
部署图 |
部署图显示了如何进行系统部署 ; 部署在哪里,也就是说,它执行的体系结构。 |
对象图 |
对象图描绘类的对象实例和它们在一个时间点上之间的关系。 |
包图 |
包图描绘模型元素在包内的组织结构和依赖关系。 |
配置文件图 |
配置文件图是那些 在«配置文件» 包中创建的扩展 UML 元素、 连接器和组件。 |
行为图包括下面的图表类型:
图类型 |
详细 |
活动图 |
活动图建模一个系统的行为。系统的整体流中这些行为是如何相关的。 |
用例图 |
用例图捕获用例以及系统和使用户之间的关系。他们描述了系统的功能要求,使用者作用于系统边界的方法以及系统的反应。 |
状态机图 |
状态机图说明了如何元素可以在状态之间移动、 根据状态转移触发器和制约条件来分类其行为。 |
时态图 |
时态图中定义不同的对象的行为时间尺度内提供更改状态,以及随着时间的推移进行交互的对象的可视化表示形式。 |
序列图 |
随着时间的推移,序列图作为一系列的有序步骤是行为结构化表示形式。他们用来描绘工作流程、 消息传递和元素一般合作随着时间达到的结果。 |
通信图 |
通信图显示了在运行时,元素之间的互动关系,并可视化对象间关系。 |
互动概述图 |
互动概述图用可视化方式说明其他交互图 (时间、 序列、 沟通和互动概述图) 之间的合作,展示控制流的作用。 |
类图
类图捕获系统的逻辑结构、 类和对象描述它存在哪些属性和行为。
类是面向对象系统中最重要的构造块。
类图显示了一组类、接口、协作以及他们之间的关系。在UML中问题域最终要被逐步转化,通过类来建模,通过编程语言构建这些类从而实现系统。类加上他们之间的关系就构成了类图,类图中还可以包含接口、包等元素,也可以包括对象、链等实例。
类图(类)
类包含类名、属性和操作,如定义一个类Contacts,它包含属性num,name,age,note以及操作AddContacts,DelContacts,GetAge,SetAge,在UML类图中该图表示为如图所示:
在UML类图中,类由三部分组成:
1、类名:类的名字,是一个字符串。
2、属性(Attributes):类的成员变量。
UML属性的表示方式为:可见性名称:类型 [ = 缺省值 ]
• “可见性”表示该属性对于类外的元素是否可见,包括公有(public)、私有(private)和受保护(protected),在类图中分别用符号+、-和#表示。
• “名称”表示属性名,用一个字符串表示。
• “类型”表示属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。
• “缺省值”是一个可选项,即属性的初始值。
3、 操作(Operations):类的成员方法。
UML操作的表示方式为:可见性名称(参数列表) [ : 返回类型]
• “可见性”的定义与属性的可见性定义相同。
• “名称”即方法名,用一个字符串表示。
• “参数列表”表示方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号“,”隔开。
• “返回类型”是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。
类图(类的关系)
类之间的关系是类图中比较复杂的内容,有关联、聚合、组合、泛化、依赖。
1、关联
关联(Association)是类与类之间最常用的一种结构化关系,用于表示一类对象与另一类对象之间的联系,通常用在一个类中被实现为一个实例变量。关联可以有单向关联、双向关联 和多重性关联。
1)单向关联
单向关联是单向的,用带箭头的实线表示。如:联系人(Contact)拥有地址(Address),则Contact类与Address类具有单向关联关系,如图所示:
2)双向关联
双向关联是双向的,有实线表示。如:顾客(Customer)买了商品(Product)并拥有商品,反之,卖出的商品总会有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系,如图所示:
3)多重关联
多重关联表示两个关联对象在数量上的对应关系。在类图中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
常见的多重性表示方式如下表所示:
表示方式 |
多重性说明 |
1..1 |
表示另一个类的一个对象只与该类的一个对象有关系。 |
0..* |
表示另一个类的一个对象与该类的零个或多个对象有关系。 |
1..* |
表示另一个类的一个对象与该类的一个或多个对象有关系。 |
0..1 |
表示另一个类的一个对象没有或只与该类的一个对象有关系。 |
m..n |
表示另一个类的一个对象与该类最少m,最多n个对象有关系 (m≤n)。 |
简单的多重关联关系示例,如图所示:
2、泛化
泛化(Generalizations) 被用来说明继承关系。泛化的含义是源类继承了目标类的特性。如:圆形(Circle)将继承形状(Shape)的属性x_position,y_position,radius和操作display()。如图所示:
3、聚合、组合
聚合(Aggregation)表示类之间整体与部分的关系。
组合(Composition)也表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。
聚合表示为白色菱形箭头(弱聚合)指向目标类或父类。
组合表示为黑色菱形箭头(强聚合)指向目标类或父类。
如:地址本(address book)由许多 联系人(contacts)和联系人组(contact groups)组成。联系人组(contact groups)是一个联系人(contacts)的虚分组, 联系人(contact)可以被包含在不止一个联系人组(contact groups)中。 如果你删除一个地址本(address book),所有的联系人(contacts)和联系人组(contact groups)都会被删除,如果你删除联系人组(contact groups),联系人(contacts)却不会被删除。如图所示:
4、依赖
依赖(Dependency)表示两个元素之间存在某种关系,表示一个事物依赖另一个事物。类的依赖关系主要体现在一个类的方法使用另一个类的对象作为参数。
依赖用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
如:驾驶员开车,将Car类型的对象car作为Driver的一个参数传递,以便在drive()方法中能够调用car的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此类Driver依赖类Car,如图所示:
附,EA工具类图元素和连接器注释:
复合结构图
复合结构图反映类、 接口和组件的内部合作 (和它们的属性) 来描述它的功能。
如:暴露接口,包含端口和部件。如图所示:
如:系统安装的关系,如图所示:
附,EA工具复合结构图元素和连接器注释:
组件图
组件图说明了软件块、 嵌入的控制器等构成了一个系统,其组织和依赖关系。
如:一个组件与另一个组件提供接口,如图所示:
附,EA工具组件图元素和连接器注释(重复的不注释了):
部署图
部署图显示了如何进行系统部署 ; 部署在哪里,也就是说,它执行的体系结构。
如:简单的服务器部署图,如图所示:
部署图还可以使用替代图像元素来表示,如图所示:
再看一图像元素的部署图,如图所示:
对象图
对象图描绘类的对象实例和它们在一个时间点上之间的关系。
对象图与类图密切相关,区别是它描述类的对象实例和它们之间在一个点时间上的关系。
对象图对于理解复杂的类图是有用的,通过创建不同情况下的应用反映类和类关系。
如driver和car的对象图,如图所示:
附:
包图
包图描绘模型元素在包内的组织结构和依赖关系。
包图是在 UML 中用类似于文件夹的符号表示的模型元素的组合。系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中。使用包图可以将相关元素归入一个系统。一个包中可包含附属包、图表或单个元素。
包图中的元素可以包含:类,类型,接口,枚举,表等等。如图所示:
配置文件图
配置文件图是那些 在«配置文件» 包中创建的扩展UML元素、连接器和组件。
配置文件提供扩展 UML 的手段。他们基于可应用于UML元素、连接器和它们的组件而附加的构造型和标记值。配置文件是这些扩展的集合,它们在一起描述一些特定的建模问题,促进建模构造。
活动图
活动图建模一个系统的行为。系统的整体流中这些行为是如何相关的。
活动图描述活动的顺序,展现从一个活动到另一个活动的控制流。活动图在本质上是一种流程图。活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程。
简单活动图:
如:接收订单,如图所示:
如:收发邮件,如图所示:
如:真假判断,如图所示:
如:分叉,如图所示:
复杂活动图:如图所示:
附,活动图元素和连接器注释:
用例图
用例图捕获用例以及系统和使用者之间的关系。他们描述了系统的功能要求,使用者作用于系统边界的方法以及系统的反应。用例是一个系统性的工作,这个系统的工作非常明确的去为某个参与者达成一个特定的目标。
主要通过泛化、包含和扩展关系说明下使用。
泛化关系:泛化关系类似于 “继承”或“多态”。 子用例继承父用例,可重载,可有特殊的行为。如图所示:
包含关系:包含关系反映一个用例包括另一个用例的行为。如:联系人管理包含联系人的增加、删除、更新。如图所示:
扩展关系:扩展关系表示一个用例扩展另一个用例的行为。如:员工提交请假申请之后,就可以打印请假单了。如图所示:
用例和功能的区别:
1、功能是脱离使用者的愿望而存在的。例如我们描述一个自行车的功能就是他能骑和载物,并无谁来使用它。
2、功能是孤立的,在系统中,给一个输入就能得到一个输出。而用例是一个系统性的工作,这个系统的工作非常明确的去为某个参与者达成一个特定的目标。
3、如果非要从功能的角度去解释用例,那么用例可以解释为一系列完成一个特定目标的功能的组合。
泛化、包含和扩展关系的区别:
1、泛化表示子用例间的互斥性。
2、包含表示被包含用例对Actor提供服务的间接性。
3、扩展表示扩展用例的触发不定性。
泛化与包含用例属于无条件发生(肯定发生的)的用例,而扩展属于有条件发生(未必发生,发生与否取决于系统状态)的用例。
附,用例图元素和连接器注释:
状态机图
状态机图说明了如何元素可以在状态之间移动、 根据状态转移触发器和制约条件来分类其行为。主要为利用状态和事件来描述对象本身的行为。
简单状态机图:
描述安装软件的行为,如图所示:
描述图书类的入库、待借、借出的类行为,如图所示:
复杂状态机图,如图所示:
附,状态机图元素和连接器注释:
时态图
时态图中定义不同的对象的行为时间尺度内提供更改状态,以及随着时间的推移进行交互的对象的可视化表示形式。
一条生命线是跨时间,由 x 轴表示标准所需的对象的路径。有两种:值生命线和状态生命线。
状态生命线遵循沿 y 轴的时间轴定义的状态之间的离散状态转移。任何状态转移有时间约束、 持续时间约束和观察的可选属性。
值生命线显示的生命线状态图中,跨平行线表示稳定的状态。跨线之间指示状态转移或状态的变化。
默认示例,如图所示:
附,时态图元素和连接器注释:
序列图
随着时间的推移,序列图作为一系列的有序步骤是行为结构化表示形式。他们用来描绘工作流程、 消息传递和元素一般合作随着时间达到的结果。
序列图使用:
1、描述工作流、 消息传递和元素间的一般合作,并随着时间推移而实现某一结果。
2、捕获系统的信息和责任,在分析早期,元素间的消息最终成为类模型的方法调用。
3、为用例方案生成解释性的模型,通过创建带有参与者的序列图以及所涉及的用例元素,你可以建立模型用户和系统承诺完成所需任务的步骤序列。
序列图描述:
1、每个序列元素按水平排列序列,消息在元素之间来回传递。
2、序列图中的消息可以是几种类型,消息也可以配置为反映操作,以及源和目标元素的属性。
3、参与者元素可用于表示用户启动的事件流。
4、构造型元素,如边界、 控制和实体,可以分别用来说明屏幕、 控制器和数据库项目。
5、每个元素都有一条虚线,称为生命线,该元素存在,并且有可能参与相互作用。
简单序列图:
发送短信,如图所示:
几种消息类型,如图所示:
复杂序列图,如图所示:
附,序列图元素和连接器注释:
通信图
通信图显示了在运行时,元素之间的互动关系,并可视化对象间关系。
通信图是对交互中有意义的对象和对象之间的链建模。
通信图主要包括:对象、链和消息。消息类型有同步、异步和返回三种,消息编号指示顺序和加工的嵌套。编号方案可能是:
1
1.1
1.1.1
1.1.2
简单通信图,如图所示:
复杂通信图,如图所示:
交叉概述图
交叉概述图用可视化方式说明其他交互图 (时间、 序列、 沟通和互动概述图) 之间的合作,展示控制流的作用。交叉概述图是活动图的变体,大部分符号都一样,使用的是矩形元素而不是活动元素。有两种类型的这些元素:
1、交叉元素显示内联交互图,可以是任何四种类型中的任何一个(序列、时机、通信或交互概述)
2、交互发生元素是对现有互动图的引用: 用框架直观地表示,框架内容显示图名称。
交叉概述图,如图所示:
总结下几种常用的关系:
泛化(Generalization):是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
实现(Realization):是一种类与接口的关系,表示类是接口所有特征和行为的实现。
关联(Association):是一种拥有的关系,它使一个类知道另一个类的属性和方法。
聚合(Aggregation):是整体与部分的关系,且部分可以离开整体而单独存在。
组合(Composition):是整体与部分的关系,但部分不能离开整体而单独存在。
依赖(Dependency):是一种使用的关系,即一个类的实现需要另一个类的协助。
最后,附上EA的工程文件,目录结构如图所示: