继承关系(generalization)
继承关系用一条带空心箭头的直线表示。如下图所示(A继承自B):
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。继承关系为is-a
的关系,是类与类或者接口与接口之间最常见的关系之一,在Java中此类关系通过关键字extends
来表示。
注意:表现在代码中,继承关系表现为一个类继承另一个类或者一个接口继承另一个接口。
实现关系(realization)
实现关系是用一条带空心箭头的虚线表示。如下图所示(A实现B)::
实现指的是一个class
类实现interface
接口(可以是多个)的功能。实现是类与接口之间最常见的关系之一,在Java中此类关系通过关键字implements
来表示。
注意:表现在代码中,实现关系表现为普通类实现某个接口。
关联关系(association)
关联关系是用一条可能会有方向的直线表示的。关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如上图,表示A关联B,但B不关联A;如下图所示:
关联关系体现的是两个类、或者类与接口之间语义级别的一种强依赖的结构关系,是一种长期的静态稳定的关系,通常与运行状态无关,一般由常识等因素决定的。
例如:乘车人和车票之间就是一种关联关系。
注意:表现在代码中,被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量。
聚合关系(aggregation)
聚合关系用一条带空心菱形箭头的直线表示,如下图所示A聚合到B,或者说B由A组成。
聚合关系用于表示实体对象之间的关系,表示整体由部分构成的意思。聚合是关联关系的一种特例,它体现的是整体与部分、拥有的关系,即has-a
的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。例如一个部门由多个员工组成。
注意:表现在代码中,和关联关系是一致的,只能从语义级别来区分。聚合与组合不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在;例如,部门撤销了,人员不会消失,他们依然存在。
组合关系(composition)
组合关系用一条带实心菱形箭头的直线表示,如下图表示A组成B,或者B由A组成。
组合关系同样表示整体由部分组成的意思。与聚合关系一样,组合也是关联关系的一种特例,它体现的是一种整体与部分不可分割的关系,即contains-a
的关系,这种关系比聚合更强,也称为强聚合。例如公司由多个部门组成组合,但此时整体与部分是不可分离的,整体的生命周期结束也就意味着部分的生命周期结束。
注意:表现在代码中,和关联关系是一致的,只能从语义级别来区分。组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也就不存在了。例如,公司不存在了,部门也将不存在了。
依赖关系(dependency)
依赖关系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系。
依赖关系是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A,与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化依赖关系也可能发生变化。
显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生。
注意:表现在代码中,依赖关系体现为类的构造方法及类方法的传入参数。
UML类关系图示例
请看以下这个UML类关系图:
- 开车的类图结构表示的是一个接口
- 有一个自行车的抽象类,实现了开车的接口,它们之间的关系为实现关系,使用带空心三角箭头的虚线表示
- 自行车与摩拜单车之间是继承关系,使用带空心三角箭头的实线表示
- 学生上学需要用到摩拜单车,与摩拜单车是一种依赖关系,使用带箭头的虚线表示
- 学生与身份证之间为关联关系,使用一根实线表示,如果两个类之间互相通过属性引用,则是双向关联关系
- 学生与班级、学生与学校之间是聚合关系,使用带空心菱形箭头的实线表示
- 学校与班级是组合关系,使用带实心菱形箭头的实线表示