UML - 类图

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

关联 Association

定义

表示一个类中拥有另外一个类的实例,可以用直线,单箭头,双向箭头表示。

多重度

多重度有:1, 1..*, 0..*, 0..1,对应表示一个类的实例能够与另一个类的多少个实例相关联。

  • 0..1
    表示拥有 0 或者 1 个实例。
  • 0..* 或者 *
    表示没有实例个数限制:0 个或多个。
  • 1
    表示仅仅拥有 1 个实例。
  • 1..*
    表示至少拥有 1 个实例。
  • n..m
    表示拥有 nm 个实例。

类图

0046-class-multiplicity-in-association.jpg

Customer 拥有多个 Car 的实例,类图关系通常使用单箭头表示。

Java 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Car {
private String brand;

public Car(String brands){
this.brand = brands;
}

public Car() {
}

public String getBrand() {
return brand;
}

public void setBrand(String brand) {
this.brand = brand;
}

}

public class Customer {
private Car[] vehicles;
ArrayList<Car> carList = new ArrayList<Car>();

public Customer(){
vehicles = new Car[2];
vehicles[0] = new Car("Audi");
vehicles[1] = new Car("Mercedes");
carList.add(new Car("BMW"));
carList.add(new Car("Chevy"));
}
}

聚合 Aggregation

其中菱形表示整体对象,箭头表示部分对象。

定义

比关联的关系更进一步,通常聚合有包含(has-a)的意思,表示整体对象包含部分对象,而关联中的两个类是平级关系。整体对象不存在时,部分对象可以独立存在。使用空心菱形和箭头表示。

类图结构

0046-class-aggregation.png

Car 包含一个 Engine,但是 Engine 可以独立存在。

Java 示例

1
2
3
4
5
6
7
8
9
10
11
public class Engine{

}

public class Car{
private Engine engine;

public void setEngine(Engine engine){
this.engine = engine;
}
}

组合 Composition

其中菱形表示整体对象,箭头表示部分对象。

定义

组合可以理解为特殊的聚合,整体对象和部分对象关系非常密切不能缺失,通常是强烈包含(contains-a)的意思。整体对象与部分对象具有同一生命周期,整体对象控制着部分对象的创建和销毁。当整体对象不存在时,部分对象也不存在。使用实心菱形和箭头表示。

类图结构

0046-class-composition.png

HeadBird 身体的一部分,不能独立存在。Head 实例是在 Bird 中创建的,由 Bird 控制它的生命周期。

Java 示例

1
2
3
4
5
6
7
8
9
10
public class Head {

}

public class Bird {
private Head head;
public Bird(){
head = new Head();
}
}

继承(泛化) Generalization

定义

表示类的继承,子类和父类是 is-a 关系。使用空心三角实直线表示。

类图结构

0046-class-generalization.png

TigerAnimal 的子类,都有吃的动作。

Java 示例

1
2
3
4
5
6
7
8
9
10
public class Animal{
public void eat(){
}
}

public class Tiger extends Animal{
@Override
public void eat(){
}
}

实现 Realization

定义

表示接口的实现,使用空心三角虚直线表示。

类图结构

0046-class-realization.png

ArrayList 实现了 List,完善所有的方法。

Java 示例

1
2
3
4
5
6
7
8
public interface List{
int size();
}

public class ArrayList implements List{
int size(){
}
}

依赖 Dependency

定义

主要体现某个类的方法使用了另外一个类的对象,两个类之间不存在拥有,包含等关联关系。使用虚线箭头表示。

类图结构

0046-class-dependency.png

Person 在计算时使用了 Computer 去计算。

Java 示例

1
2
3
4
5
6
7
8
9
10
public class Computer{
public void calculator(){
}
}

public class Person{
public void calculator(Computer computer){
computer.calculator();
}
}

小结

各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖。

  • 关联的两个对象之间一般是平等的
  • 聚合和组合都是关联关系,但是强弱有区别。聚合关系是 has-a 关系,组合关系是 contains-a 关系

网上有一个比较全的例子,体现类图的所有关系:

0046-all-class.png

工具

本文画类图的工具为:StarUML 。工具箱中的功能基本满足常见类图需求,常用使用技巧:

  • 接口实现
    使用 Composite Structure --> Realization 来表示,默认的 Interface Realization 是一条直线。
    0046-staruml-tools.png
  • 注释换行
    使用 shift + Enter 实现换行。
  • 内部类
    在右边的 Model Explorer 中,直接将类 Builder 拖入类 Product,就可以表示内部类。将 Builder 拖入类图中后,会多一个 from Product 的标识。
    0046-staruml-inner-class.png

参考文档

0%