类图中常见的几种关系分别为:
泛化(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之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
* 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
* 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
* 学生与身份证之间为关联关系,使用一根实线表示;
* 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;