组合,关联,聚合的区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

组合,关联,聚合的区别
类间关系
在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造⽐单独⼯作更⼤的语义。

在UML类图中,关系⽤类框之间的连线来表⽰,连线上和连线端头处的不同修饰符表⽰不同的关系。

类之间的关系有继承(泛化)、关联、聚合和组合。

(1)继承:指的是⼀个类(称为⼦类)继承另外的⼀个类(称为基类)的功能,并增加它⾃⼰的新功能的能⼒,继承是类与类之间最常见的关系。

类图中继承的表⽰⽅法是从⼦类拉出⼀条闭合的、单键头(或三⾓形)的实线指向基类。

例如,图3.2给出了MFC中CObject类和菜单类CMenu的继承关系。

图3.2 类的继承
类的继承在C++中呈现为:
class B { }
 class A : public B{ }
(2)关联:指的是模型元素之间的⼀种语义联系,是类之间的⼀种很弱的联系。

关联可以有⽅向,可以是单向关联,也可以是双向关联。

可以给关联加上关联名来描述关联的作⽤。

关联两端的类也可以以某种⾓⾊参与关联,⾓⾊可以具有多重性,表⽰可以有多少个对象参与关联。

可以通过关联类进⼀步描述关联的属性、操作以及其他信息。

关联类通过⼀条虚线与关联连接。

对于关联可以加上⼀些约束,以加强关联的含义。

 关联在C++中呈现为:
class A{...}
 class B{ ...}
 A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)
即⼀个类作为另⼀个类⽅法的参数。

(3)聚合:指的是整体与部分的关系。

通常在定义⼀个整体类后,再去分析这个整体类的组成结构。

从⽽找出⼀些组成类,该整体类和组成类之间就形成了聚合关系。

例如⼀个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动⼒攻击潜艇等。

需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。

(4)组合:也表⽰类之间整体和部分的关系,但是组合关系中部分和整体具有统⼀的⽣存期。

⼀旦整体对象不存在,部分对象也将不存在。

部分对象与整体对象之间具有共⽣死的关系。

聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表⽰整体与部分的关系⽐较弱,⽽组合⽐较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的⽣存期⽆关,⼀旦删除了聚合对象不⼀定就删除了代表部分事物的对象。

组合中⼀旦删除了组合对象,同时也就删除了代表部分事物的对象。

我们⽤浅显的例⼦来说明聚合和组合的区别。

“国破家亡”,国灭了,家⾃然也没有了,“国”和“家”显然也是组合关系。

⽽相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独⽴存在,还可以接在别的计算机上。

在聚合关系中,部分可以独⽴于聚合⽽存在,部分的所有权也可以由⼏个聚合来共享,⽐如打印机就可以在办公室内被⼴⼤同事共⽤。

在C++语⾔中,从实现的⾓度讲,聚合可以表⽰为:
class A {...}
 class B { A* a; .....}
即类B包含类A的指针;
⽽组合可表⽰为:
class A{...}
 class B{ A a; ...}
即类B包含类A的对象。

准确的UML类图中⽤空⼼和实⼼菱形对聚合和组合进⾏了区分。

图3.4 聚合和组合
聚合,关联,组合 是对象之间的三种关系。

从某种意义上说,继承是⼀种类的纵向关系,⽽聚合,关联,组合是对象的横向关系。

其关系强弱为 关联<聚合<组合
关联和聚合的区别主要在语义上,关联的两个对象之间⼀般是平等的,例如你是我的朋友,聚合则⼀般不是平等的,例如⼀个公司包含了很多员⼯,其实现上是差不多的。

聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其⽣命期有很⼤的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。

⼀般来说被组合对象不能脱离组合对象独⽴存在,⽽且也只能属于⼀个组合对象,例如⼀个⽂档的版本,必须依赖于⽂档的存在,也只能属于⼀个⽂档。

聚合则不⼀样,被聚合的对象可以属于多个聚合对象,例如⼀个员⼯可能可以属于多个公司。

我想举个通俗的例⼦。

你和你的⼼脏之间是composition关系(⼼脏只属于⾃⼰)
你和你买的书之间是aggregation关系(书可能是别⼈的)
你和你的朋友之间是association关系。

相关文档
最新文档