关联, 聚合, 组合关系


类间关系
在类图中,除了须要描述单独的类的名称、属性和操做外,咱们还须要描述类之间的联系,由于没有类是单独存在的,它们一般须要和别的类协做,创造比单独工做更大的语义。在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关系
聚合与组合的区别:聚合∶分散的汇集到一块儿 组合∶几个独立部分组成的总体 由上可见,聚合就像将不一样的水果放到一个玻璃果盘里,玻璃果盘摔坏,并不影响水果。
Trackback:http://blog.csdn.net/baobeiSimple/archive/2007/06/12/1648617.aspx
 
本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/guopengzhang/archive/2009/11/23/4853993.aspx
相关文章
相关标签/搜索