UML全称Unified Modeling Language 又称统一建模语言或标准建模语言。我们再学习各种框架或者设计模式之类的时候经常会看到UML类图,这里将UML类图一些基本点做一个记录。
在文章中所涉及到的UML类图是使用starUML工具创建,使用其他工具创建会有所不同。
总体印象
上面的UML类图基本展示了UML类图的大部分元素,以及类与类之间的关系,下面将对其一一进行解释。
NOTE
UML类图注解的表示方法,如上右半部所示。
类结构表示
类的表示方法如图,一般分为三层,从上到下依次为类名、属性和方法。接口表示和类的表示类似,只是在上面标明了是interface(这只是表示接口的一种方式,并且不同的工具展现方式可能不同,还有一种棒棒糖的形式,就是一个圆加一条竖线,并不常见,所以也不过多介绍),并且这里我隐藏了属性层。如果是抽象类,在使用starUML工具创建的时候类名会以斜线表示。关于类的表示有以下几点:
- +:public,-:private,#:protected
- 属性冒号后的内容表示属性的类型
- 方法冒号后的内容表示属性的返回值
- 类型说明并不是必须的
类关系表示
实现
实现(Realization),用一个带空心三角箭头的虚线来表示。用来表示接口和实现类的关系。比如:Plane(飞机)和Car(汽车)都实现了接口IVehicle(交通工具)。
继承
继承(Generalization,也称为泛化关系),用一个带空心三角箭头的实线来表示。表示父类与子类之间的关系。比如:Trunck(卡车)和Bus(公交车)都继承自父类Car(汽车)。
关联关系
关联(Association),关联关系分为以下几种
- 自关联:用一头带箭头的实线表示,自己指向自己
- 单向关联:用一头带箭头的实线表示,箭头指向被关联类
- 双向关联:用一条实线表示,或者使用双箭头
关联关系表示类与类之间的联系,是同一层次上的关系,它不像依赖关系具有偶然性和临时性。一般情况是关联类引用被关联类作为全局变量。如下Human持有Name。
大多数的关联关系都是单向的。
聚合关系
聚合(Aggregation),用一头是空心菱形的直线表示(有些时候是一头为空心菱形,一头为箭头的实线)。聚合也是关联关系的一种,是整体和部分之间的关系,也就是has-a的关系(很多地方has-a,contains-a已经比较混乱,我理解上来看是has-a),整体包含部分,但是部分脱离整体后依然可以单独存在。如上:Car(汽车)包含Engine(引擎),但是Engine脱离了Car依然可以独立存在。
组合关系
组合(Composition),用一头是实心菱形的直线表示(有些时候是一头为实心菱形,一头为箭头的实线)。组合同样是一种关联关系,也同样是整体和部分之间的关系,我把它理解为contains-a的关系。和聚合的区别在于,部分脱离整体和无法单独存在,整体和部分具有相同的生命周期,整体不存在了,部分也就消失了。如上:Human(人类)包含Head(头)和Body(身体),头和身体并不能单独存在。
依赖关系
依赖(Dependency),用一头带箭头的虚线表示。表示类与类之间,一个类依赖于另一个类的定义。被依赖类的变化将会引起依赖类的变化。在java中依赖关系通常体现为,一个类使用另一个类作为局部变量,方法参数或静态方法调用,表示为use-a。如上,Engine的方法startEngine()方法使用Gasoline(汽油)作为参数,可能是调用了Gasoline中的burn()方法。