前言
类图是一个静态图,它是用来模拟一个系统的静态视图,也被认为是类图作为基础组件图和部署图。
类图不仅用于可视化系统的静态视图,但它们也可用于构建可执行代码的任何系统中的前向和反向工程。
UML 图一般不直接映射到任何面向对象的编程语言,但在类图是一个例外。
类图清楚地显示了映射面向对象语言,如Java,C++等,因此,从实际经验的类图通常用于构建用途。
因此类图可以用来:
- 描述系统的静态视图。
- 显示静态视图中的元素之间的协作。
- 由系统执行的功能的描述。
- 构建软件应用面向对象的语言。
图例:
类
类表示封装状态(属性)和行为(操作)的概念。每个属性都有一个类型。每个操作都有一个签名。类名是唯一的强制性信息。
第一个块描述类相关的信息。斜体表示抽象类,否则表示普通类。
+号表示可访问修饰符,-号表示私有修饰符,#号表示类保护修饰符。即定义成员的访问范围。
第二个块描述属性成员的信息。修饰符后紧跟着成员名以及成员的类型名。
第三个块描述函数成员的信息。修饰符后紧跟着函数名、形参的参数信息以及函数返回值的类型名。
关联
是一种拥有的关系,它使一个事物知道另一个事物的特性;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的。
关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
如下图例子中:动物和气候两个类,动物需要‘知道’气候的变化,才去决定什么时候完成某些事情。像这样主要强调了解不强调使用的关系,我们称为关联。
【代码体现】:成员变量,访问属性或方法。一个类以成员变量的形式出现在另一个类中,或者说是一个类中引用了另一个类的全局变量;
【图示体现】:一条实心直线连接两个拥有‘关联’关系的类或带普通箭头的实心线,指向被拥有者。
依赖
是两个事物间的依赖关系,这种使用关系是具有偶然性的,临时性的。表现在程序路径上,一个事物使用另一个事物,因这个事物的变化随即影响到了自身的语义。
举例:进食。动物新陈代谢需要进食,动物和食物,动物吃食物。他们两者之间就是一个“使用”关系,也就是依赖。依赖是一种弱关联关系。
依赖只能是单向的,指向被使用者。
【代码体现】:一个类实例作为参数被另一个类在某个method方法中使用;
【图示体现】:一条虚线连接两个拥有‘使用’间关系的类并由使用者指向被使用者。
只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖。
继承(泛化)
是一种继承关系,表示一般与特殊的关系, 用这种方法,子元素(特殊)共享了父类(一般)的结构和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【代码体现】:子类继承了父类。
【图示体现】:一条以空心三角箭头为线尾指向被父类并连接两个拥有‘泛化’关系的类的直线。
实现
是一种类与接口的关系,表示类实现的接口所有结构和行为。
【代码体现】:类实现接口。
【图示体现】:一条以空心三角箭头为线尾指向被接口并连接两个拥有‘实现’关系的类的虚线。
聚集
聚集(Aggregation):也称聚合,是整体与部分的关系。部分可以离开整体而单独存在。如燕群和大雁是整体和部分的关系,大雁离开燕群仍然可以存在。
聚集关系是一种特殊的关联关系,是强的关联关系;区分关联和聚集,主要观察结构关系(聚集描述了整体与部分间的结构关系)。
下图显示了聚集的示例。关系显示为实线,在定义聚合关系的一端有一个空心的菱形,它连接到表示部分的类。
组合
组合(Composition):是整体与部分的关系。部分不能离开整体而单独存在。如大雁和翅膀是整体和部分的关系,没有大雁的话,翅膀也就不存在了,也就没有了意义。
组合关系是关联关系的一种,是比聚集关系还要强的关系,它要求普通的聚集关系中代表整体的事物要负责代表部分的事物的生命周期,即部分的生命周期与整体相互绑定。
下图显示了一个组合示例。关系显示为实线,在定义组合关系的一端带有实心菱形,它连接到表示部分的类。
对于聚集和组合,有些书上(如:软件设计师教程第五版)在指向表示部分类的一端带有箭头,且箭头样式也各异,也有的书上忽略箭头。
绘制工具
drawio