一. UML概述
是为面向对象软件系统产品进行分析、设计、说明、编辑文档的标准语言, 能帮助软件开发人员 进行思考 和 记录思路结果;
特点: 简单、统一、图形化、能表达软件设计中的动态与静态信息。
UML本身是一套符号的规定,这些符号用于描述模型中的各个元素和它们之间的关系, 如类、接口、实现、泛化、依赖、组合、聚合等;
1997 年 UML 被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标准;
二. 应用场景
UML模型大多以图表的方式表现,通常包含几个块或框、连接线和作为模型附加信息的文本。在 UML 规则中相互联系和扩展。
三. 基本构件
UML建模的核心是模型,模型是实现的简化、真实系统的抽象,UML提供了系统的设计蓝图,当给软件系统建模时,需要采用通用的符号语言,
这种描述模型所使用的语言被称为建模语言, 在UML中,所有的描述由 事物、关系 和 图 这些构件组成,下图完整地描述了所有构件的关系;
1.事物
事物是抽象化的最终结果, 分为结构事物、行为事物、分组事物 和 注释事物;
1.结构事物
结构事物是模型中的静态部分,用于呈现概念 或 实体的表现元素, 如下表所示:
事物 | 解释 | 图例 |
类 (Class) | 具有相同属性、方法、关系和语义的对象集合 | |
接口(Interface) | 指一个类或构件的一个服务的操作集合,它仅仅定义了一组操作的规范,并没有给出这组操作的具体实现 | |
用例(User Case) | 指对一组动作序列的描述,系统执行这些动作将产生一个对特定的参与者(Actor)有价值且可观察的结果 | |
协作(Collaboration) | 定义元素之间的相互作用 | |
组件(Component) | 描述物理系统的一部分 | |
活动类(Active Class) | 指对象有一个或多个进程或线程。活动类和类很相象,只是它的对象代表的元素的行为和其他元素是同时存在的 | |
节点(Node) | 定义为运行时存在的物理元素 |
2.行为事物
行为事物指 UML 模型中的动态部分,如下表所示:
事物 | 解释 | 用例 |
交互(Interaction) | 包括一组元素之间的消息交换 | |
状态机(State Machine) | 由一系列对象的状态组成 |
3.分组事物
目前只有一种分组事物,即包。它是概念上的, 只存在于开发阶段,结构事物、行为事物甚至分组事物都可能放在一个包中; 如下图所示:
事物 | 解释 | 用例 |
包(Package) | UML中唯一的组织机制 |
4.注释事物
注释事物是解释 UML模型元素的部分, 如下图所示:
事物 | 解释 | 用例 |
注释(Note) | 用于解析说明 UML 元素 |
2.图
UML 2.0 一共有13种图 分别为 类图、对象图、构建图、部署图、活动图、用例图、时序图、协作图 9种,
以及包图、组合结构图、时间图、交互概览图 4种.
图名称 | 解释 |
类图(Class Diagrams) | 用于定义系统中的类 |
对象图(Object Diagrams) | 类图的一个实例,描述了系统在具体时间点上所包含的对象及各个对象之间的关系 |
构件图(Component Diagrams) | 一种特殊的 UML 图,描述系统的静态实现视图 |
部署图(Deployment Diagrams) | 定义系统中软硬件的物理体系结构 |
活动图(Activity Diagrams) | 用来描述满足用例要求所要进行的活动及活动间的约束关系 |
状态图(State Chart Diagrams) | 用来描述类的对象 所有可能的 状态 和 时间 发生时, 状态的转移条件 |
用例图(Usecase Diagrams) | 用来描述用户的需求,从用户的角度描述系统的功能,并指出各功能的执行者,强调谁在使用系统、系统为执行者完成哪些功能 |
时序图(Sequence Diagrams) | 描述对象之间的交互顺序,着重体现对象间消息传递的时间顺序,强调对象之间消息的发送顺序,同时显示对象之间的交互过程 |
协作图(Collaboration Diagrams) | 描述对象之间的合作关系,更侧重向用户对象说明哪些对象有消息的传递 |
包图(Package Diagrams) | 对构成系统的模型元素进行分组整理的图 |
组合结构图(Composite Structure Diagrams) | 表示类或者构建内部结构的图 |
时间图(Timing Diagrams) | 用来显示随时间变化,一个或多个元素的值或状态的更改,也显示时间控制事件之间的交互及管理它们的时间和期限约束 |
交互概览图(Interaction Overview Diagrams) | 用活动图来表示多个交互之间的控制关系的图 |
3.类图及类图之间的关系
在UML2.0中 的13种图中, 类图(class Diagrams) 是使用频率最高的 UML 图之一, 类图描述系统中的类,以及各个类之间的关系的静态视图,
能让我们在正确编写代码前对系统有个全面的认识,类图是是一种静态模型类型,它表示类、接口和它们之间的协作关系,用于系统设计阶段;
1.类(class)
类是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(OOP)的基础,
具有封装性、继承性和多态性等三大特性;在UML中,类是young包含类名、属性和操作且带有分隔线的矩形表示;
-
类名(Name) 是一个字符串, 例如:Student;
-
属性(Attribute) 是指类的特性,即类的成员变量。UML按以下格式表示;
[可见性] 属性名:类型[=默认值] //例如 -name:String
注意:“可见性” 表示该属性对类外的元素是否可见,包括公有(public)、私有(private)、受保护(protected)和朋友(package)四种,
在类图中分别用符号+、-、#、~ 表示;
-
操作(Operations) 是类的任意一个实例对象都可以使用的行为、是类的成员方法,UML按以下格式表:
[可见性]名称(参数列表):[返回类型]//例如 +display():void
如下所示是学生类的UML表示:
类图用 3 个矩形拼接表示,最上面的部分标识类的名称,中间的部分标识类的属性,最下面的部分标识类的方法;
类图中需要注意以下几点:
-
抽象类或抽象方法用斜体表示
-
如果是接口,则在类名上方加<<Interface>>
-
字段和方法返回值的数据类型非必需;
-
静态类或静态方法加下划线;
2.接口(Interface)
接口 是一种特殊的类,它具有类的结构但不可被实例化,只可以被子类实现,它包含抽象操作,但不包含属性。
它描述了类或组件对外可见的动作,在UML中,接口使用一个带有名称的小圆圈进行表示;
如下所示是图形类接口的 UML 表示
3.类图(ClassDiagram)
类图 是用来显示系统中的类、接口、协作以及它们之间静态结构和关系的一种静态模型。它主要用于描述系统的结构化设计
帮助人们简化对软件系统的理解,它是系统分析与设计阶段的重要产物,也是系统编码与测试的重要模型依据;
类图中的类可以通过某种编程语言直接实现。类图在软件系统开发的整个生命周期都是有效的,它是面向对象系统的建模中最常见的图。
如下所示是“计算长方形和圆形的周长与面积”的类图,图形接口有计算面积和周长的抽象方法,长方形和圆形实现这两个方法供访问者调用;
4.类之间的关系(6种)
UML 将事物之间的联系归纳为 6 种,并用对应的图形表示,下面根据类与类之间的耦合度从弱到强排列。UML 中的类图有以下几种关系:
依赖关系、关联关系、聚合关系、组合关系、泛化(继承)关系 和 实现关系;其中泛化 和 实现的的耦合相等,它们是最强的。
1.依赖关系(Dependence)
依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式。是临时性的关联。在代码中,某个类的 方法 通过 局部变量、方法的参数
或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。 只要是在类中用到了对方,那么他们之间就存在依赖关系;
[如果没有对方,连编译都通不过];
1) 类的成员属性;
2) 方法的返回类型;
3) 方法接收的参数类型;
4) 方法中使用到的局部变量;
在 UML 类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。
如下是人与手机的关系图,人通过手机的语音传输方法打电话。
2.关联关系(Association)
关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。
它是依赖关系的特例,分为一般关联关系、聚合关系 和 组合关系。关联关系具有 导航性: 可以是双向的,也可以是单向的:
双向关联用带两个箭头或没有箭头的实线来表示,单向关联用带一个箭头实线来表示,箭头从使用类指向被关联的类。也可以在
关联线的两端标注角色名,代表两种不同的角色;
在代码中通常将一个类的对象作为另一个类的成员变量来实现关联关系。如下是老师和学生的关系图,每个老师可以教多个学生,
每个学生也可向多个老师学,他们是双向关联。
关系具有多重性:
"1"(表示有且仅有一个) "0..."(表示0个或多个), "0,1"(表示0个或1个),
"n...m"(表示n到 m个都可以), "m...*^n"(表示至少m个)
1>单向一对一关系: -card
Person{ private IDCard card} IDCard{} Person ───> IDCard
2>双向一对一关系: -person -card
Person{private IDCard card} IDCard{Private Person person} Person─────IDCard
*但是如果在程序中Person中定义了对IDCard级联删除,即删除Person时连同IDCard一起删除,那么IDCard 和 Person 就是组合关系了;
3.聚合关系(Aggregation)
聚合关系表示的是整体和部分的关系是 has-a 的关系。在类A的成员变量中含有类B的对象的引用,
但类B的成员变量中没有类A的对象的引用,则A和B的关系称为聚合,聚合是一种“弱拥有”关系;
学校与老师的关系,学校包含老师,但如果学校停办了,老师依然存在。
在UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。如下是大学和教师的关系图。
4.组合关系(Composition)
组合关系也是关联关系的一种,也表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系,是contains-a 关系。
类A和类B除符合聚合关系外,且A、B对象的生命周期必须一致,也就是类A的构造函数中要为成员变量B创建对象,因此组合关系是强引用关系
在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在,
例如:头和嘴的关系,没有了头,嘴就不存在了,属于同生共死,不可分离的关系;
在 UML 类图中,组合关系用带实心菱形的实现来表示,菱形指向整体。如下是头和嘴的关系图。
聚合关系与组合关系的对比
public class Person{ © Person
private IDCard idCard; //可分离 □ idCard: IDCard
private Head head = new Head();//不可分离 □ head: Head = new Head()
public void setIDCard(IDCard idCard){ ◊ ♦
this.idCard=idCard; 聚合关系 | | 组合关系
} 整体与部分可分 | | 整体与部分不可分
} Person 与 IDCard | | Person 与 Head
public class IDCard{} public class Head{} IDCard © © Head
5.泛化关系(generalization)
泛化关系是依赖关系的特例,实际上就是继承关系,是is-a的关系;
在 UML 类图中,泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来
实现泛化关系。例如,Student类 和 Teacher 类 都是Person类 的子类,其类图如下所示:
6.实现关系(Realization)
实现关系也是依赖关系的特例,它是接口与实现类之间的关系,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作;
在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口,例如汽车和船实现了交通工具。
5.类关系记忆技巧
分类 | 箭头特征 | 记忆技巧 |
箭头方向 | 从子类指向父类 | 1.定义子类需要通过 extends 关键字指定父类; 2.子类一定是知道父类定义的,但父类并不知道子类的定义; 3.只有知道对方信息时才能指向对方; 4.箭头的方向是从子类指向父类; |
继承/实现 | 用线条连接两个类; 空心三角箭头表示继承或实现 | 1.实线表示继承,是 is-a的关系,表示扩展,不虚,很结实 2.虚线表示实现,虚线代表“虚” 无实体; |
依赖/关联 | 用线条连接两个类; 普通箭头表示关联或依赖; | 1.虚线表示依赖关系,是使用关系,一个类需要借助另一个类来实现功能 2.一般一个类将另一个类作为参数使用,或作为返回值。 |
1.实线是关联关系,表示一个类对象和另一个类对象有关联 2.通常一个类中有另一个类对象作为属性; | ||
聚合/组合 | 用菱形表示:像一个容器 | 1.聚合:空心菱形,代表容器可将很多相同东西聚集在一起(箭头方向所指的类) 2.整体和局部的关系,分别有独立的生命周期,是 has-a 关系;属于弱关系; |
1.组合:实心菱形,代表容器内有实体结构存在,生死与共; 2.整体与局部关系比聚合更紧密,两者有相同的生命周期,contains-a的关系; |
注:UML的标准类关系图中,没有实心箭头。