类图是UML中的一个图表,用于描述系统中的类、接口、协同以及它们之间的关系。类图可以显示系统中这些概念的静态结构,也是其他图的基础,例如状态图、协作图、组件图和配置图等。在UML类图中,有多种类型的类和接口,以及它们之间的关系。例如,泛化关系描述的是“is a kind of”的关系,使用带空心三角形的箭头来表示,箭头从子类指向父类;实现关系是关于规格说明和其实现之间的关系,它将一种模型元素与另一种模型元素连接起来,比如类和接口;依赖关系则表示某个类或者接口所依赖的另一个类或接口。

它表示这样一种情形,对于一个元素(提供者)的某些改变可能会影响或提供消息给其它元素(客户),即客户以某种形式依赖于其它类元。

这主要的情形为:

- 客户类的操作需要提供者类的参数;

- 客户类的操作返回提供者类;

- 客户类的操作在实现中使用提供类的对象。

下面举个例子来说明这三种情形:

依赖关系举例:

```java

class Car{ public void Move(){} class Person{ public void Travel(Car car){ car.Move();} public Car BuyCar(float price){} public void DoSth(){Car car; ...} }

```

关联关系是一种结构关系,指出了一个事物的对象与另一个事物的对象之间的语义上的连接。关联的任何一个连接点都叫做关联端。关联端可以有自己的角色、多重性、可见性等修饰。关联也可以有自己的名称。在UML中,关联关系用一条连接两个类的实线表示:

```plaintext

上面的图中,“拥有”为关联的名称,“客户”为类Person的角色,“交通工具”为类car的角色。角色也可以有自己的可见性,“客户”和“交通工具”前的“+”即代表其可见性为公有。关联端的“1”和“0..n”是描述的多重性,下面将会做进一步的介绍。

```

关联的多重性(Multiplicity)是指有多少个对象可以参与该关联,可用来表达一个取值范围、特定值、无限定的范围或一组离散值。多重性是UML中使用最广泛的约束,主要有以下几种形式:

```plaintext

0 恰为0 0..n 0到多个 1 恰为1 1..n 1到多个 0..1 0或1 3..n 3到多个,至少3个 n 0或多个 3,5,7 3个或5个或7个

```

关联关系多重性:单向关联用带箭头的实线表示,箭头由源类指向目标类,这种关联实际上是带导航的关联。它指在源类中要使用目标类的对象作为成员:

```plaintext

上面类之间的关系可以使用下面的Java代码来表示:

class Department{} class Teacher { Department depart; }

```

双向关联关系不再绘制箭头,使用直线直接连接两个类即可。例如,下面两个类之间的关系即是双向关联关系:

```java

class Category {

Film film;

}

class Film {

Category category;

}

```

带有角色修饰的双向关联:

带有角色修饰的双向关联是指一个类与另一个类之间存在双向关联关系,且其中一个类具有特定的角色。实现这种关联关系的Java代码可表示如下:

```java

class Teacher {

public Student aLearner;

}

class Student {

public Teacher alnstructor;

}

```

自关联关系即一个类与自己进行关联。下面类关系的意思是employee类中有一个为employee类型的leader成员,表示员工的领导:

```java

public class employee {

private employee leader;

}

```

聚合关系表示整体与部分关系的关联,一组元素组成了一个更大、更复杂的单元。聚合关系描述了“has a”的关系,在UML中聚合关系用带空心菱形头的实线来表示,头部指向整体。这种关系中的空心菱形并不是箭头,它只表明哪端是整体。聚合的双向关联的一个例子,它表示College类是University类的一个聚合成分:

```java

class University {

public List colleges;

}

class College {

public University university;

}

```

如果是单向的聚合关系,可以使用下面的方式来表示:跟上面那个例子的区别是,这种聚合关系只在University类中声明College类的成员对象,不在College类中声明University的成员对象。使用Java代码实现如下:

```java

class University {

public List colleges;

}

class College {

}

```

当然单向的聚合关系也可以表示下图的形式:使用Java代码实现如下:

组合关系是聚合的一种特殊情况,它表示成员的生命周期取决于聚合的生命周期。在UML中,组合使用带实心菱形头的实线来表示,其菱形在整体这一端。

例如,下面的Triangle类由多个Side类对象组合而成。当Triangle对象创建时,Side的对象被创建;当Triangle对象被销毁时,其Side对象也将被销毁。我们可以使用Java代码实现这个概念:

```java

class Side {}

class Triangle {

private final List sides;

public Triangle(List sides) {

this.sides = sides;

}

}

```

三、实战

制作类图的一般步骤如下:

1. 研究分析问题领域,确定系统的需求;

2. 发现对象与对象类,明确他们的含义和责任,确定属性和操作;

3. 发现类之间的静态联系;

4. 设计类与联系;

5. 绘制类图并编制相应的说明。

以S校图书馆借阅系统的类为例,经过认真分析类之间的关系,我们可以使用ProcessOn工具绘制出如下的类图:

```plaintext

ProcessOn绘制的S校图书馆借阅系统类图

```