UML类图

类图中常见的几种关系分别为:

泛化(Generalization)

类的继承结构在UML中的表现为两种关系,继承与实现;
继承关系为is-a的关系,两个对象之间如果可以用is-a来表现,就是继承关系:

eg:自行车是车,狗是动物
泛化关系可以用带空心箭头的实线表示,如下图,A继承自B

eg:汽车在现实中有实现,可用汽车定义具体的对象;汽车与SUV之间就是泛化关系。

最终代码中,泛化表示继承非抽象类

实现(Realization)

实现关系用一条带空心箭头的虚线表示;
eg:“车”是一个抽象的概念,在现实中无法来定义对象,只有指明具体的子类(汽车还是自行车),才能来定义对象

最终代码中,实现关系表现为继承抽象类

关联(Assocition)

关联关系就用一条箭头的实线来表示,箭头指向被关联类,可以为单向也可以是双向箭头;
eg:客户类与订单类之间就是关联关系

关联关系默认不强调方向(也是最上图中学生与身份证之间没有用箭头的原因),如果特别强调方向,如下图,表示A知道B,但是B不知道A;

最终代码中,关联对象通常是以成员变量的形式实现的

聚合(Aggregation)

表示has-a的关系,是一种不稳定的包含关系。较强于一般关联,有整体和局部的关系,并且没有了整体,局部也可单独存在。如公司与部门之间的关系,公司没有了,部门也就没有了,用一个带空心菱形的箭头表示,菱形从局部指向整体,如下图。

如下图,可以说是A聚合到B上,或者说是B由A组成;

聚合关系用于表现实现对象之间的关系,表示整体由部门构成,例如一个公司没有了,部门也就没有了;

与组合关系不用的是:
整体和部门不是强依赖的,即使整体不存在了,部分也存在,例如,公司没有了,部门也就没有了,但是员工还在。

组合(Composition)

contains-a是一种强烈的包含关系,组合类负责被组合类的生命周期,是一种更强的聚合关系,部分不能脱离整体存在,部分不能脱离整体存在,用带实现箭头的实线来表示,菱形从局部指向整体。
如公司和部门的关系,没有了公司,部门也不能存在了;调查问卷中问题和选项的关系;订单和订单选项的关系。

如下图表示A组成B,或者B由A组成;

依赖(Dependency)

依赖关系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系

与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;
显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生;

注:在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;

示例

* 车的类图结构为<<abstract>>,表示车是一个抽象类;
* 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
* 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
* 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
* 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
* 学生与身份证之间为关联关系,使用一根实线表示;
* 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;

参考

看懂UML类图和时序图
UML类图与类的关系详解

Fork me on GitHub