一、关联
关联是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。两个类之间的简单关联表示了两个同等地位类之间的结构关系。给定有关联的两个类,可以从一个类的对象得到一个类的对象。关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。被关联的对象还可以再被别的对象关联,关联是可以共享的。
关联表示 has-a 关系,A has-a B --> A关联B --> B作为A的属性存在。
1、两元关系
两元关系是指一种一对一的关系,例如:一个人只能有一张身份证,而一张身份证只能归属于一个人。
// 人
public class Human{
// 一个人只能有一张身份证
Identify identify;
}
// 身份证
class Identify{
// 一张身份证只属于一个人
Human human;
}
2、多元关系
多元关系是一对多或多对一的关系,我们可以使用数组或集合来描述这个关系。例如:一个人可以有多本证书,而一本证书只能归属于一个人。
// 人
class Human{
// 一个人可以有多本证书
Certificate[] certificate;
}
// 证书
class Certificate{
// 一本证书只属于一个人
Human human;
}
3、聚合
聚合是较强的关联关系,强调的是整体与部分之间的关系,表示整体对象拥有部分对象。聚合的整体和部分之间在生命周期上没有必然的联系,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁之后销毁。例如,汽车与发动机、轮胎以及其它的零件之间的关系,便是整体和部分的关系。
// 汽车
class Car {
// 汽车可以有发动机, 但是不确定何时安装
Engine engine;
// 汽车可以有轮胎, 但是不确定何时安装
Tyre tyre;
}
// 发动机
class Engine {}
// 轮胎
class Tyre {}
被聚合的对象可以再被别的对象关联,被聚合对象是可以共享的。例如,汽车和飞机都有发动机,便是被聚合对象是可以共享的。
// 汽车
class Car {
// 汽车可以有发动机, 但是不确定何时安装
Engine engine;
}
class Plane {
// 飞机可以有发动机, 但是不确定何时安装
Engine engine;
}
// 发动机
class Engine {}
4、组合
组合关系是整体与部分的关系,部分属于整体,整体不存在,部分一定不存在。组合是聚合的一种形式,它具有拥有关系,强调整体与部分的生命周期是一致的,整体负责部分的生命周期的管理。生命周期一致指的是部分必须在整体创建的同时或者之后创建,在整体销毁之前或者同时销毁,部分的生命周期不会超出整体的生命周期。
组合是关系当中的最强版本,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命期的关系。如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制。
例如Windows的窗口和窗口上的菜单就是组合关系。
// Windows的窗口
class Windows {
// 如果Windows的窗口被关闭,窗口上的菜单也必须跟着一起被关闭
// 这个窗口上的菜单只属于Windows的窗口,不被共享
Menu menu = new Menu();
}
// 窗口上的菜单
class Menu {}
二、依赖
依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。
依赖体现了 use a 关系,依赖关系一般使用方法的参数体系。
例如,人用笔才能写字,如果人没有笔就写不了字,人有了笔才能写字,笔对人而只是一个工具,而人并不持有对它的引用。
// 人
class Human{
// 人有了笔才能写字
public void writeWord(Pen pen) {}
}
// 笔
class Pen{}