目录
一、什么是类图?
UML:统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明,展示,构建和记录软件系统的产出。
类图(Class Diagram)是描述类、接口、协同以及他们之间关系的图,用来显示系统中这些概念的静态结构。类图也是其它图的基础,我们可以在类图的基础上,使用状态图、协作图、组件图和配置图等。
二、UML类图怎么画?
2.1 单个类
常见的类图和接口
除此之外还有一些表示:
- 静态属性/方法:加上下划线,如 -ClassAttribute: Long
- 抽象属性/方法:使用斜体表示,如 +AbstractOperation()
- 职责:可以在操作部分的下面再添加一个区域,用来说明类的职责,即说明类或其它元素的契约或义务。
- 约束:指定了该类所要满足的一个或多个规则,用大括号表示,如 {Some Properties}
2.2 类之间的关系
2.2.1 泛化关系
泛化关系描述的是“is a kind of”的关系,使用带空心三角形的箭头来表示,箭头从子类指向父类:
泛化关系
下面是一个车辆Vehicle与Truck之间的泛化表示:
车辆Vehicle与Truck之间的泛化关系
实现这种关系的Java代码如下:
class Vehicle{}
class Truck extends Vehicle{}
2.2.2 实现关系
实现关系是关于规格说明和其实现之间的关系,它将一种模型元素与另一种模型元素连接起来,比如类和接口。实现关系将不同语义层上的元素连接起来,这种关系不仅使用于接口和类之间,也可以是类的不同等级之间的联系,如粗设计与细设计之间。
实现一般使用带空心三角形的虚线箭头表示,箭头指向接口。下面是关于接口和实现接口类之间的标识方法:
实现关系
下面是一个具体的接口和实现之间的例子。IUser是一个接口,VipUser是一个类,VipUser类要实现接口IUser:
实现关系举例
其Java代码可以表示成下面的形式:
interface IUser{
public void walk();
class VipUser implements IUser {
public void walk(){}
2.2.3 依赖关系
它表示这样一种情形,对于一个元素(提供者)的某些改变可能会影响或提供消息给其它元素(客户),即客户以某种形式依赖于其它类元。
依赖关系
这主要的情形为:
- 客户类的操作需要提供者类的参数;
- 客户类的操作返回提供者类;
- 客户类的操作在实现中使用提供类的对象。
下面举个例子来说明这三种情形:
依赖关系举例
使用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; ...}
}
2.2.4 关联关系
关联关系是一种结构关系,指出了一个事物的对象与另一个事物的对象之间的语义上的连接。
关联的任何一个连接点都叫做关联端。关联端可以有自己的角色、多重性、可见性等修饰。关联也可以有自己的名称。在UML中,关联关系用一条连接两个类的实线表示:
关联关系
上面的图中,“拥有”为关联的名称,“客户”为类Person的角色,“交通工具”为类car的角色。角色也可以有自己的可见性,“客户”和“交通工具”前的“+”即代表其可见性为公有。关联端的“1”和“0..n”是描述的多重性,下面将会做进一步的介绍。
关联的多重性(Multiplicity)是指有多少个对象可以参与该关联,可用来表达一个取值范围、特定值、无限定的范围或一组离散值。多重性是UML中使用最广泛的约束,主要有以下几种形式:
形式 | 含义 | 形式 | 含义 |
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个 |
关联关系多重性
单向关联
单向关联用带箭头的实线表示,箭头由源类指向目标类,这种关联实际上是带导航的关联。它指在源类中要使用目标类的对象作为成员:
单向关联
上面类之间的关系可以使用下面的Java代码来表示:
class Department{}
class Teacher {
Department depart;
}
双向关联
双向关联关系不再绘制箭头,使用直线直接连接两个类即可,如下面两个类之间的关系即是双向关联关系:
双向关联
实现这种关系的Java代码可以如下表示:
class Category{
Film film;
}
class Film {
Category category;
}
带有角色修饰的双向关联:
带有角色修饰的双向关联
实现这种关联关系的Java代码可表示如下:
class Teacher{
public Student aLearner;
}
class Student{
public Teacher alnstructor;
}
自关联
自关联关系即一个类与自己进行关联。下面类关系的意思是employee类中有一个为employee类型的leader成员,表示员工的领导:
自关联
实现这种关联关系的Java代码可表示如下:
public class employee{
private employee leader;
}
2.2.5 聚合关系
聚合关系表示整体与部分关系的关联,一组元素组成了一个更大、更复杂的单元。聚合关系描述了“has a”的关系,在UML中聚合关系用带空心菱形头的实线来表示,头部指向整体。这种关系中的空心菱形并不是箭头,它只表明哪端是整体。聚合的双向关联的一个例子,它表示College类是University类的一个聚合成分:
聚合关联
使用Java实现的代码如下所示:
class University{
public List<College> colleges;
}
class College {
public University university;
}
如果是单向的聚合关系,可以使用下面的方式来表示:
单向聚合关联关系
跟上面那个例子的区别是,这种聚合关系只在University类中声明College类的成员对象,不在College类中声明University的成员对象。使用Java代码实现如下:
class University{
public List<College> colleges;
}
class College {
}
当然单向的聚合关系也可以表示下图的形式:
单向聚合关系表现形式
使用Java代码实现如下:
class University{}
class College {
public University university;
}
2.2.6 组合关系
组合关联是聚合的一种特殊情况,是更强形式的聚合(即强聚合),成员的生命周期取决于聚合的生命周期。聚合不仅控制着成员对象的行为,而且控制着成员对象的创建和解构。
在UML中,组合使用带实心菱形头的实线来表示,其菱形在整体这一端:
组合关联
上面的Triangle类由多个Side类对象组合而成,当Triangle对象创建时,Side的对象被创建,Triangle对象被销毁时,其Side对象也将被销毁。使用Java代码实现如下:
class Side{}
class Triangle {
private final List<Side> sides;
public Triangle(List<Side>sides){
this.sides=sides;
}
}
三、实战
制作类图的一般步骤:
- 研究分析问题领域,确定系统的需求;
- 发现对象与对象类,明确他们的含义和责任,确定属性和操作。
- 发现类之间的静态联系;
- 设计类与联系;
- 绘制类图并编制相应的说明。
需求
S校图书馆借阅系统的”类“
经过认真分析类之间的关系,使用ProcessOn工具绘制的类图如下:
ProcessOn绘制的S校图书馆借阅系统类图