avatar

目录
UML类图的介绍

UML的介绍

UML —— Unified Modeling Language(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果

UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。

截止UML2.0一共有13种图形(UML1.5定义了9种,2.0增加了4种)。分别是:用例图类图对象图状态图活动图顺序图协作图构件图部署图9种,包图组合结构图交互概览图3种

主要模型

在UML系统开发中有三个主要的模型:

  1. 功能模型
    从用户的角度展示系统的功能,包括 用例图
  2. 对象模型
    采用对象、属性、操作、关联等概念,展示系统的结构和基础,包括 类图对象图包图
  3. 动态模型
    展现系统的内部行为。包括 序列图活动图状态图

UML类图

生成 UML 的工具 —— IDEA中的插件 PlantUML其他工具

类图基础属性

方法、成员变量的权限表示:

符号 含义
- private
+ public
# protected
~ default(包私有)
_ static(静态)
斜体 abstract(抽象)

类图示例

类与类之间的关系

UML中描述对象和类之间相互关系的方式包括:依赖关联聚合组合泛化实现等。

而关系的强弱:组合 > 聚合 > 关联 > 依赖

关系类型 具体内容 栗子
聚合 表明对象之间的整体与部分关系的关联 has a
组合 表明整体与部分之间有相同生命周期关系的聚合 contains a
依赖 描述了对象之间的调用关系 方法中的调用
关联 描述了对象之间的结构关系 作为成员变量

关系图标

依赖 —— 虚线箭头

依赖(Dependency):

元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A; 类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示,箭头指向被依赖元素。

注意:

  1. 依赖关系也是类与类之间的联结
  2. 依赖总是单向的(要避免 双向依赖 。一般来说,不应该存在双向依赖)
  3. 依赖关系在 JavaC++ 语言中体现为 局部变量方法的参数 或者 对静态方法的调用
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@startuml

class Person {
+buy(Car car): void
}
class Car

Car <.. Person

note as N1
Car对象的变化会影响到Person对象,
所以 Person 依赖于 Car
注意:
1. 依赖总是单向的,不应该存在 双向依赖
2. 依赖关系体现在 局部变量方法参数静态方法的调用
end note

@enduml

依赖关系

关联 —— 实线箭头

关联(Association):

元素间的结构化关系,是一种 弱关系 ,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。

注意:

  1. 关联关系是类与类之间的联结,它 使一个类知道另一个类的属性和方法
  2. 关联可以是双向的,也可以是单向的(还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头
  3. 在 Java 或 c++ 中,关联关系是通过 使用成员变量 来实现的
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@startuml

class 多啦A梦 {
-tools: List
}
class Tool

多啦A梦 "1" --> "*" Tool : "关联"

note as N1
关联关系,作为成员变量
end note

@enduml

关联关系

聚合 —— 空心菱形头的实线

聚合(Aggregation):

关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示菱形头指向整体。

注意:

  1. 聚合关系是关联关系的一种,是 强的关联关系
  2. 聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成
  3. 聚合关系也是通过 成员变量 来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分
  4. 关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@startuml

class 汽车 {
-轮胎[4]: 轮胎
-发动机: 发动机
}
class 轮胎
class 发动机

汽车 o--> 轮胎 : "聚合"
汽车 o--> 发动机 : "聚合"

note as N1
聚合关系 —— 空心的菱形,菱形指向整体
(整体被破坏,个体不一定随之被破坏)
(聚合的个体可能被多个整体所共享)
has a
end note

@enduml

聚合关系

组合 —— 实心菱形头的实线

组合(Composition):

组合是聚合关系的变种,表示元素间更强的组合关系(整体 contains a 部分)。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体

注意:

  1. 组合关系是关联关系的一种,是比聚合关系还要强的关系
  2. 它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@startuml

class Person {
-eyes[2]: Eye
-mouse: Mouse
}
class Mouse
class Eye

Person *--> Mouse : "组合"
Person *--> Eye : "组合"

note as N1
组合关系 —— 实心的菱形,菱形指向整体
(整体被破坏,个体一定被破坏)
contains a
end note

@enduml

组合关系

一般化关系(泛化和实现)

表示类与类之间的继承关系接口与接口之间的继承关系,或类对接口的实现关系。一般化关系是子类指向父类的,或从实现接口的类指向被实现的接口,与继承或实现的方向相反

泛化 —— 空心三角箭头的实线

泛化(Generalization):通常所说的 继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心三角箭头的实线表示箭头指向一般个体。

注意:

  1. 带空心三角箭头的实线表示
  2. 泛化表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用 extends 关键字来直接表示这种关系
  3. 泛化关系表示类与类之间的继承关系,接口与接口之间的继承关系
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@startuml

abstract class Vehicle {
-color: String
-weight: double
+{abstract} run(): void
}
class Sports_Car
class Boat

Vehicle <|-- Sports_Car : "继承"
Vehicle <|-- Boat : "继承"

note as N1
泛化(继承)关系
—— 空心三角箭头的实线,箭头指向父类或父接口
B is a kind of A
end note

@enduml

泛化关系

实现 —— 空心三角箭头的虚线

实现(Realization):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心三角箭头和虚线表示箭头指向定义约定的元素。

实现关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。 对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@startuml

interface IMath {
+{abstract} calculate(): void
}

IMath <|.. Person : "实现"

note as N1
实现关系
—— 空心三角箭头的虚线,箭头指向实现的接口
B realize A
end note

@enduml

实现关系

UML类图工具

  1. 建模软件 —— Rational Rose
  2. IDEA中的插件 —— PlantUML (本笔记使用)
    —> plantUML的使用语法
  3. Eclipse中的插件 —— AmaterasUML
  4. 在线作图网址:ProcessOn

我是不会告诉你新型冠状病毒的战役期间ProcessOn有团队版60天试用的!

文章作者: Amor-Joo
文章链接: https://cutealien.cn/2020/02/10/UML-Class-Diagram/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cutealien
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论