本节以实例讲述依赖、关联、聚合、组合关系。(类实现关系接口为虚线箭头,类继承(泛化关系)一个类为实线箭头。)
Car类有三个成员变量,一个Tire指针,一个Door,一个Person指针,以及一个方法cleanCar,该方法传入一个洗车设备的参数。
我们这里对汽车这个类做一个说明:
1. 汽车是由轮胎Tire组成,就算没有汽车,轮胎也是可以单独存在的
2. 没有了汽车便没有汽车门(这里把门看作是一个空间的概念,而不是看做物理的那种门,就好比没有颜色概念的话也就没有黑色这种说法,这里即:没有车就没有门,这是为了说明一种关系)
3. 汽车需要人开,车的存在和人的存在没有关系,仅仅是说车需要人来开
4. 有一个洗车的方法,该方法需要传入一个洗车设备,这个洗车设备并不是车的一部分,只有洗车的时候才会临时用到该设备。
以及相应的描述,我们来逐一描述依赖、关联、聚合、组合这四种关系。
1. 依赖。Car与CleanMachine之间的关系为聚合,Car与CleanMachine是一种临时关系,即CleanMachine作为Car的方法的参数,或者方法中的局部变量;
2. 组合。Car与Door之间的关系为组合,Car由Door组成,但是一旦没有了Car,Door也就不存在了;
3. 聚合。Car与Tire之间的关系为聚合,Car有Tire组成,但是没有了Car,Tire依然是存在的;
4. 关联。Car与Person之间的关系为关联,Car需要Person来开,但是Car不是由Person组成。
我们从一个类A的角度看与另一个类B的关系,进一步说明:
1. 依赖表现为类B为类A中的成员函数的参数、或成员函数中的局部变量,而不是作为成员变量
2. 从关联到聚合到组合的关系越来越强,都是成员变量,但是:
a. 在关联中,类B是类A的指针型成员变量(即A类型对象的消失了,B类型对象依然可以存在),同时类A和类B没有整体和部分的关系,例如汽车和人之间的关系
b. 在聚合中,类B是类A的指针型成员变量(即A类型对象的消失了,B类型对象依然可以存在),同时类A和类B是整体和部分的关系,例如汽车和轮胎之间的关系
c. 在组合中,类B是类A非指针型成员变量(即A类型对象的消失了,B类型对象也消失了),同时类A和类B是整体和部分的关系,例如汽车和门(这个空间)之间的关系
多重性:
1. 一个Car有一个Person(司机,这里person指司机),因此在Person端有个符号1;
2. 一个Person(司机)开一辆车Car,因此在Car端有个符号1;
3. 一个Car有四个Tire(轮胎),因此在Tire端有个符号4;
4. 一个Tire仅能在一个Car上,因此在在Car端有个符号1。需要注意的是,如果认为“ 一个Tire可能在一个Car上,也可能不在Car上”那么Car端的符号为0..1;
5. 一个Car只有一个Brand(标志),所以在Brand端符号为1;
6. 一个标志会在0量或多辆车上,所以Car端符号为*。
