UML 类图存在的意义是为了帮助开发人员清理思路,这样有助于学习设计模式,能够通过UML类图宏观的了解到类与类和接口与接口之间的关系。
在 UML 类图中,关系是指类与类之间的关系(这里类的含义也包括接口与抽象),常见的关系有以下几种:
- 泛化(Generalization)
- 实现(Realization)
- 关联(Association)、聚合(Aggregation)、组合(Composition)
- 依赖(Dependency)
UML 类图的关系主要体现在:
- 类与类之间的关系
- 类与接口之间的关系
- 接口与接口之间的关系
各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
泛化关系(Generalization)
- 泛化是类与类或接口与接口之间的一种继承关系,它指定了子类如何特化父类的所有特征和行为。
比如:一个类继承自另一个类,一个接口继承自另一个接口。 - 【体现形式】:在 PHP 中通过 extends 关键字来标识。
- 【图形特征】:用实线连接的空心三角形箭头,箭头指向父类。
实现关系(Realization)
- 实现是一种类与接口的关系,表示类是接口所有特征和行为的实现。
比如:一个类实现了一个或多个接口。 - 【体现形式】:在 PHP 中通过 implements 关键字来标识。
- 【图形特征】:用虚线连接的空心三角形箭头,箭头指向接口。
依赖关系(Dependency)
- 依赖是一种类与类之间的使用关系,也是类与类之间最弱的关系,但尽量不要使用双向的互相依赖,而是更多使用单向依赖。
比如:一个类A使用了类B,这种关系具有临时性特征,可能是类A的某个方法参数依赖了类B,也可能是类A的某个局部变量依赖了类B,那么当类B发生变更的时候,类A可能也要受到影响。 - 【体现形式】:局部变量、方法的参数、或静态方法的调用。
- 【图形特征】:虚线连接的普通箭头,箭头指向被使用者。
关联关系(Association)
- 关联是一种类与类之间,或接口与接口之间的拥有的关系,它使一个类知道另一个类的属性和方法,体现的是一种强依赖的关系,而且两个类之间的关系是平等的,关联可以是双向的,也可以是单向的。
- 【体现形式】:成员变量,类B作为类A的成员变量出现;类A拥有类B的实例。
- 【图形特征】:实现连接的普通箭头,箭头指向被拥有者,双向的关联可以有两个普通箭头或者没有箭头,而单向关联也就只有一个箭头了。
聚合关系(Aggregation)
- 聚合是关联关系的一种,主要表达的是整体与部分之间的关系,但部分脱离整体又可以独立存在,并且部分拥有独立的生命周期。
比如:A对象可以包含B对象,但是B对象不是A对象的组成部分,B对象可以被单独使用,又可以独立运行。 - 【体现形式】:成员变量,变量赋值可以在整体的构造方法中,也可以在普通的 set 方法中(依赖倒置,这也体现了两者可以具有不同的生命周期)。
- 【箭头特征】:实线连接的空心菱形箭头,菱形箭头指向整体。
组合关系(Composition)
- 组合关系也是关联关系的一种,并且同样是描述整体与个体之间的关系,它是比聚合关系还要强的关联关系,它要求普通的聚合关系中,代表整体的对象负责代表部分的对象的生命周期,也就是说部分生命周期受整体影响,如果整体不存在了,那么部分也就不存在了。
- 【体现形式】成员变量,变量的赋值是在整体的构造方法中创建,外界不知道部分的存在,那么整体没了,部分也就不存在了(两者具有相同的生命周期)。
- 【箭头特征】实线连接的实心菱形箭头,菱形指向整体。
下面的这张图,比较形象的展示了各种类图关系: