关联关系是使用实例变量来实现
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。
聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。
也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。如果A由B组成,表现为包含有的全局对象,并且对象在创建的时刻创建。负责对象的生命周期。
[聚合和组合的区别]:
聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
准确的UML类图中用空心和实心菱形对聚合和组合进行了区分。
聚合,关联,组合 是对象之间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。
其关系强弱为 依赖<关联<聚合<组合
我们从一个类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是整体和部分的关系,例如汽车和门(这个空间)之间的关系;