UML类图

前言

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

作用

类图是软件工程的统一建模语言一种静态结构图,该图描述了系统的类集合,类的属性和类之间的关系。帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。学习好类图的绘制,是一位合格的软件工程师应有的技能。

Mac UML绘图工具 StartUml

类的UML图示

在UML类图中,类一般包含类名,属性,操作方法及其参数并且用分割线分隔的长方形表示
类
上图中

类名 Person

全局变量(成员变量) name,age

方法 getName,setName,getAge,setAge

注:面向对象的语言叫方法;面向过程的语言叫函数

类名

我使用的uml工具里,当类是抽象类时,类名会倾斜。

属性

UML中的属性名就是Java中的成员变 表示方式如下
<< stereotype >> name : type[multiplicity]=value

可见性 可以通过按钮设置,或者在name 前 手动输入 可见性 可见性有4中,分别是

+public
# protected
- private
~ package

操作方法

表示方式如下
<< stereotype >> name(param1 : type1[multiplicity]=default,param2,……) : returnType

与属性相比,多了返回类型和行参。 可见性 设置与属性一致

类图内的六大关系

依赖(Dependency)、关联(Association)、聚合(Aggregation)、组合(Composition)、泛化(Generalization)、实现(Interface Realization)

其中 依赖(Dependency)、关联(Association)、聚合(Aggregation)、组合(Composition)指的是两对象间的关系。

实现(Interface Realization)

一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性
实现
实现-交通工具

泛化(Generalization)

一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
泛化
泛化-人

依赖(Dependency)

依赖关系是类与类之间最弱的关系,依赖可以简单的理解一个类使用了另一个类,这种使用关系具有临时性特征,但是一个类又会由于另一个类的改变而受到影响。在Java内表现为行参(局部变量),非成员变量。在UML类中用一个带箭头的虚线表示,箭头指向被调用类
依赖
依赖-具体

关联(Association)

两个类、或者类与接口之间语义级别的一种强依赖关系。关联关系是一种包含关系,在UML中用一个带箭头的实线表示,箭头指向被包含类。这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;在Java内表现为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。在UML类中用一个带箭头的实线表示,箭头指向被包含类 关联
关联-具体

关联的数量关系如下

0..1 表示另一个类的一个对象没有或只与该类的一个对象有关系
1 表示另一个类的一个对象只与该类的一个对象有关系
0.. 表示另一个类的一个对象与该类的零个或多个对象有关系
1..
表示另一个类的一个对象与该类的一个或多个对象有关系

* 任意多个对象关联

聚合(Aggregation)

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类中聚合关系用带空心菱形的直线表示,由部分指向整体。
聚合-具体

组合(Composition)

组合也是关联关系的一种特例,部分存活周期受到整体的影响,若整体不存在则部分也将不存在。他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。表现在代码层面,此时部分需在整体的构造方法中创建。在UML类中组合关系用带实心菱形的直线表示,由部分指向整体。

组合-具体

使用的完整类图

完整类图

关系之间的区别

  1. 聚合与组合
    (1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
    (2)部件的生命周期不同 聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。 组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。

    (3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。

  2. 关联和聚合
    (1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
    (2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
    (3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
    (4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

  3. 关联和依赖
    (1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
    (2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。 4.综合比较 这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;
    但总的来说,后几种关系所表现的强弱程度依次为: 组合>聚合>关联>依赖;

参考

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

Java利器之UML类图详解

坚持原创技术分享,您的支持是对我最大的鼓励!