UML 是分析程序和理解程序间的调用关系时,不可多得的利器。本篇文章介绍几种程序开发中经常使用的 UML 视图,并辅以真实的 Java 案例。

类图

类的属性和方法的可见性(访问控制),如下图

抽象类

抽象类的类名以及抽象方法的名字都用斜体字表示。

静态属性和静态方法用下划线标出。

展示类的泛化(继承)关系。

接口

接口在类图中的第一层顶端用构造型 <<interface>> 表示,下面是接口的名字,第二层是方法。

展示接口与实现类的关系。

类图中的关系

我们用“王者荣耀”中的案例来说明这几种关系:

泛化关系(Generalization)

泛化关系描述的是类与类、接口和接口之间的继承关系或类与接口的实现关系,即 IS-A 的关系。泛化关系由子类指向父类,如上图中的 LiuShan(刘禅辅助)LiuBei(刘备) 就属于一般化关系。

关联关系(Association)

关联关系描述的是类与类之间的联接,它使一个类知道另一个类的属性和方法,关联可以是双向的也可以是单向的,单向关联更加普遍,单向关联使用一个箭头表示,箭头指向的方向表示关联的方向,双向关联可以使用双箭头或者无箭头,关联关系符号的两端可以有一个基数,表明实例之间对应数量的关系。关联关系在 Java 中一般是通过实例变量来表示的,如“王者世界”中的 LuBan(鲁班射手)LiuShan(刘禅辅助) 就是关联关系,且一个射手对应一个辅助,所有两端的基数为 1:1。

聚合关系(Aggregation)

聚合关系是关联关系的一种,是一种强的关联关系,聚合关系强调的是部分与整体的关系,即 HAS-A 的关系。如“王者世界”中的 LiuShan(刘禅辅助)Cure(治疗) 之间的关系就是聚合关系,Cure(治疗) 这种辅助召唤师技能就属于辅助的一部分,而 LiuShan(刘禅辅助) 就属于整体。聚合关系在 Java 中也是通过实例变量来表示的,所以从语法上无法区分聚合关系和关联关系,如果不确定某种关系是不是聚合关系,那么你可以将其设为关联关系。

组合关系

合成关系也是关联关系的一种,它是一种比聚合关系还强的关联关系,它强调部分与整体中的整体需要负责部分的生命周期,合成关系不可以共享,即 Contains-A 的关系。如“王者世界”中的 LiuShan(刘禅辅助) 和它的身躯 MachineBody(机器身躯)。合成关系在 Java 中也是通过实例变量来表示的,所以当无法区分合成关系和以上两种关系时,可以将其设为关联关。

依赖关系

依赖关系描述的也是类与类之间的联接,但依赖关系总是单向的,依赖关系表示一个类依赖于另一个类的定义,依赖关系在 Java 在体现为局部变量、方法参数及静态方法的调用,如“王者世界”中的 LuBan(鲁班射手) 的发育(grow)总是依赖 Equipment(装备)

一般而言,每一个类图都应该有类、关联关系、基数,常用的基数如下:

时序图

类图表示的静态关系不随时间流逝而变化,而时序图恰好相反,随着时间流逝而发生变化的关系。