1. UML 类图
⏰ 概述
UML
类图是一种通用的静态结构图,该图描述了系统的类集合,类的属性和类之间的关系等。他们一般都被用于应用程序的概念建模(conceptual modelling),并可将模型转译成代码。UML
类图中最常用的关系有如下几种泛化(Generalization)
,实现(Realization)
,依赖关系(Dependency)
,关联(Association)
,聚合(Aggregate)
,组成(Composition)关系
- 类图中关系表示如下:
⏰ 泛化关系(Generalization)
泛化(generalization)
关系时指一个类(子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己新功能的能力,继承是类与类或者接口与接口最常见的关系,在Java中通过关键字extends来表示。用带空心三角形箭头的实线表示。
⏰ 实现关系(Realization)
实现(Realization)
指的是一个class类实现interface接口(可以是多个)的功能;在Java中此类关系通过关键字implements明确标识。用带空心三角形箭头的虚线表示。
⏰ 依赖关系(Dependency)
依赖关系(Dependency)
可以简单的理解为一个类A使用到了另一个类B," … uses a …",被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。而这种使用关系是具有偶然性、临时性的、非常弱的,但是B类的变化会影响到A;表现在代码层面,为类B作为参数被类A在某个method(方法)中使用
。用带燕尾箭头的虚线表示。表示一个类依赖于另外一个类的定义;依赖关系仅仅描述了类与类之间的一种使用与被使用的关系。- 在java中,依赖表现为:
局部变量
,方法中的参数
和对静态方法的调用
。
⏰ 关联关系(Association)
关联关系(Association)
代表一个家族的联系。关联可以命名,可以饰以角色名称,有权指针,多重性,可视性,以及其他属性(如相互关联和有方向的(带燕尾箭头的实线表示)关联)。在语义上是两个类之间、或类与接口之间一种强依赖关系,是一种长期的稳定的关系," … has a …" 。关联关系使一个类知道另外一个类的属性和方法;通常含有“知道”、“了解”的含义。某个对象会长期的持有另一个对象的引用,关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。- 在代码层面:被关联类以
类属性
的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量
。目前定义有五种不同类型的关联。双向(Bi-directional)和单向(uni-directional)的关联是最常见的。 - 关联表示:可以使用
单箭头
表示单向关联,使用双箭头
或者无箭头
表示双向关联,不建议使用双向关联,关联有两个端点,每个端点可以有一个基数,表示这个关联的类可以有几个实例:
①0..1
表示可以有0个或者1个实例
②0..*
表示对实例的数目没有限制
③1
表示只能有一个实例
④1..*
表示至少有一个实例 - 在Java中,关联关系是使用实例变量来实现的
⏰ 聚合关系(Aggregate)
聚合关系(Aggregation)
是关联关系
的特例,是强的关联关系,是表示整体与部分的一类特殊的关联关系,是“弱”的包含(" … owns a …" )关系,成分类可以不依靠聚合类而单独存在,可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享(sharable)。例如,池塘与(池塘中的)鸭子。再例如教授与课程就是一种聚合关系。又例如图书馆包含(owns a) 学生和书籍。即使没有图书馆,学生亦可以存在,学生和图书馆之间的关系是聚集。图形以空心的菱形箭尾与实线来表示。- 聚合关系也是使用实例变量来实现的,在java语法上区分不出关联和聚合,关联关系中类出于一个层次,而聚合则明显的在两个不同的层次。
⏰ 组成(Composition)
组成(Composition)关系
,是一类“强”的整体与部分的包含关系(" … is a part of …")。成分类必须依靠合成类而存在。整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。合成类别完全拥有成分类别,负责创建、销毁成分类别。例如汽车与化油器,又例如公司与公司部门就是一种组成关系。图形以实心的菱形箭尾与实线表示。
⏰ 关联、组成和聚集的差异
- 它们的差别主要描述了子类的生命周期的不同。
组成
关系中,一旦父类被销毁子类也会随之销毁;聚合
关系中,子类的生命周期与父类独立。 - 另一个维度他们的关联关系强弱如下: 由弱到强分别是
依赖 < 关联 < 聚合 < 组成
- 范例: 例如,一个大学包含若干个系(如化学系),每个系由若干名教授。如果大学撤销,这些系也就不复存在了,但这些教授仍会继续存在。还需注意,一名教授可以在不同系甚至不同学校兼职,而一个系不能属于两所大学。所以,大学与系之间是组成关系,而系与教授是聚合关系。