UML_Java类图

引:在看源码或者很多技术书籍的时候都避免不了看到类图,时间长了总会忘了含义,在这里就总结一下,方便以后回顾。这里使用的工具是startUML。

UML

UML: 统一建模语言(Unified Modeling Language)。在 UML 系统开发中有三个主要的模型:

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

类图

类图使用类来描述系统的静态结构,类图包含类和它们之间的关系,它描述系统内所声明的类,但它没有描述系统运行时类的行为。

在UML类图中,类一般由三部分组成:类名、属性以及操作。

类名

每个类都必须有一个名字,类名是一个字符串。

属性

属性是指类的性质,即类的成员变量。类可以有任意多个属性,也可以没有属性。

格式为: 【可见性】 属性名 【:类型】 【=初始值】 【{属性字符串}】

可见性:在UML中public类型用符号“+”表示,private类型用“-”表示,protected类型用“#”表示。

属性字符串:用来指定关于属性的其他信息,任何希望添加属性定义字符串但又没有合适地方可以加入的规则都可以放在属性字符串里,例如类变量。

操作

操作是类的任意一个实例对象都可以使用的行为,操作是类的成员方法。

格式为:【可见性】 操作名 【{参数列表}】 【:返回类型】 【{属性字符串}】

类之间的关系

关联关系

关联关系(Association)是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一个类与另一个类之间有联系。

在 UML 类图中,用实线连接有关联的的类。在实现关联关系时,通常将一个类的对象作为另一个类的属性。

单向关联

类的关联关系可以是单向的,单向关联用带箭头的实线表示。如下图:
derectAssociation

1
2
3
4
5
6
7
public class Person {
private Address address;
}

public class Address {

}

双向关联

默认情况下,关联是双向的。如下图:
association

1
2
3
4
5
6
7
public class Order {
private Product product;
}

public class Product {
private Order order;
}

自关联

在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。如下图:
slfeAssociation

1
2
3
public class Node {
private Node node;
}

重数性关联

重数性关联关系又称为多重性关联关系,表示一个类的对象与另一个类的对象连接的个数。在 UML 中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
如下图:
multiplicityAssociation

其中数字的种类及含义如下表:

表示方式 表示含义
1..1 表示另一个类的一个对象只与一个该类对象有关系
0..* 表示另一个类的一个对象与零个或多个该类对象有关系
1..* 表示另一个类的一个对象与一个或多个该类对象有关系
0..1 表示另一个类的一个对象没有或只与一个该类对象有关系
m..n 表示另一个类的一个对象与最少m、最多n个该类对象有关系 (m<=n)

聚合关系

聚合关系表示一个整体与部分的关系。通常在定义一个整体类后,再去找出这个整体类的一些成员类,该整体类和成员类之间就形成了聚合关系。

在聚合关系中,成员类是整体类的一部分,即成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。如下图:
aggregation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Car {
private Engine engine;

public Car(Engine engine) {
this.engine = engine;
}

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

public class Engine {

}

组合关系

组合关系也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。

在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。在UML中,组合关系用带实心菱形的直线表示。如下图:
composition

1
2
3
4
5
6
7
8
9
10
11
public class Head {
private Eye eye;

public Head() {
this.eye = new Eye();
}
}

public class Eye {

}

依赖关系

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。如下图:
dependency

1
2
3
4
5
6
7
8
9
10
11
public class Driver {
public drive(Car car) {
car.move();
}
}

public class Car {
public move() {
...
}
}

泛化关系

泛化关系也就是继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系。在UML中,泛化关系用带空心三角形的直线来表示。如下图:
generalization

实现关系

实现关系是类实现了接口,类中的操作实现了接口中所声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线(mac中的startUML画不出来,大家将就着看)来表示。如下图:
realization

总结

理解类图有助于我们更好的去看技术书籍,以及源码,这是必备技能,get it!

参考

  1. UML 及 StarUml