UML中关联,聚合,组合的区别及C++实现

 

类间关系

在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在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关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql server management studio 快速折叠object explorer中的instance

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6e20fa7a-c0a9-496b-89b2-19c6bd996ffc/how-to-collapse-object-explorer-tree-in-management-studio?forumsqltools home键,回到top level。 然后F5刷新,就会自动折叠了转载于:https://www.…

自动白平衡算法学习

一、概述 1、颜色恒常性 首先,从色彩学的角度,自然界中的任一种颜色都可以用红、绿、蓝三种颜色混合而成,因此这三种颜色被做为最常用的三原色,即RGB 三原色。 其次,眼睛对于色彩的察觉是由于光照射在物体之上,物体会吸收一部分波长的光,而其被物体反射的那部分波长的光…

自动曝光算法学习

一、概述 在一个完整的成像系统中,所得图像的亮度由四个方面因素所决定:环境光照强度、相机的光圈大小、曝光时间、信号增益。从这四个因素可以看出,首先环境光照强度是由外界环境光照所决定的,达不到人为任意控制;因此想要调整图像亮度至合适的程度,需要考虑对光圈大小、…

cocos2d-x 帧动画

ani cc.Animation:create(); ...... local animate cc.Animate:create(ani); s:runAction(animate); 发现一个问题,s如果是Node实例话就报错了,s必须是Sprite实例。转载于:https://www.cnblogs.com/qianwang/p/6249720.html

编写一个简单的spring MVC程序

一、下载和安装spring框架 进入http://repo.springsource.org/libs-release-local/org/springframework/spring/4.2.0.RELEASE/下载一个spring框架,然后打开lib目录里的jar文件拷贝到项目的WEB-INF/lib目录下。 二、配置web.xml文件 ?1234567891011121314151617181…

DM368 Uboot

这三个参数均有UBOOT直接传递给内核,所以要想知道他们具体的作用,需要根系内核模块的结构。 dm365_imp.oper_mode 是指在内核模块中内存空间采用连续、或者不连续模式。 davinci_capture.device_type 是你的捕获设备的…

7. B+树

一、B树是应文件系统所需而产生的一种B树的变形树 1. 定义(使用阶数m来定义) 除了根结点外,其他非终端结点最多有m个关键字,最少有⌈m/2⌉个关键字结点中的每个关键字对应一个子树所有的非终端结点可以看成是索引部分,…

Retinex理论及算法学习

为了能够获取最大的信息量,达到更好的图像增强效果。了解人类视觉系统的特性和图像的属性是准确地选择图像增强方法的必备知识。 一、人眼视觉系统 1、人眼成像 人的眼睛是一个非常复杂的器官。一般来说它就是一个球体,平均直径约为20mm,内壁是一层视网膜(retina),前部…

js或css文件后面的参数是什么意思?

经常看到不少导航网站测样式或js文件后面加了一些参数&#xff0c;主要是一你为一些并不经常更新的页面重新加载新修改的文件。 经常遇到页面里加载的js与css文件带有参数&#xff0c;比如&#xff1a; <script type"text/javascript" src"jb51.js?version1…

TCP/IP协议与UDP协议的区别

首先咱们弄清楚&#xff0c;TCP协议和UCP协议与TCP/IP协议的联系&#xff0c;很多人犯糊涂了&#xff0c;一直都是说TCP/IP协议与UDP协议的区别&#xff0c;我觉得这是没有从本质上弄清楚网络通信&#xff01;TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。…

C++类静态成员与类静态成员函数

当将类的某个数据成员声明为static时&#xff0c;该静态数据成员只能被定义一次&#xff0c;而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本&#xff0c;但静态数据成员只有一个实例存在&#xff0c;与定义了多少类对象无关。静态方法就是与该类相关…

HDR 成像技术学习(一)

在描述一个场景的时候,动态范围(Dynamic Range)指的是其最亮部与最暗部的亮度比值。高动态范围的场景(High Dynamic Range Scene)指的是场景里同时存在非常明亮和非常暗淡的部分。 图像传感器所能捕捉的动态范围是有限的,它受到两个因素的限制,一个是满阱容量(Full Wel…

Linux编程 3 (初识bash shell与man查看手册)

一.初识bash shell 1.1 启动 shell GNU bash shell 能提供对Linux系统的交互式访问。通常是在用户登录终端时启动&#xff0c;登录时系统启动shell依赖于用户账户的配置。etc/passwd文件包含了所有系统用户列表以及每个用户的基本配置信息。      如上图:最后一个字段&…

HDFS概述(5)————HDFS HA

HA With QJM 目标 本指南概述了HDFS高可用性&#xff08;HA&#xff09;功能以及如何使用Quorum Journal Manager&#xff08;QJM&#xff09;功能配置和管理HA HDFS集群。 本文档假设读者对HDFS集群中的一般组件和节点类型有一般的了解。有关详细信息&#xff0c;请参阅HDFS架…

MFC动态创建菜单

http://blog.csdn.net/csdnzhwk/article/details/47395639转载于:https://www.cnblogs.com/darknoll/p/6252917.html

RTP/RTCP

http://hi.baidu.com/ilovejoy/blog/item/daee10efa91e501afdfa3c5f.html http://hi.baidu.com/kikicat0_0/blog/item/6fed87b4b4fb89c536d3ca91.html

HDR 成像技术学习(二)

回顾下之前介绍的内容: HDR成像技术学习(一) 介绍了从HDR、HDR+等多帧HDR技术到硬件的单帧HDR技术。 从技术上来说,单帧HDR要比多帧HDR简单不少,在早期设备处理能力不足的时候,速度快,没拖影,性能要求低的单帧HDR反而要更有优势。到了HDR+时代,单帧HDR渐渐不…

go微服务框架go-micro深度学习(一) 整体架构介绍

产品嘴里的一个小项目&#xff0c;从立项到开发上线&#xff0c;随着时间和需求的不断激增&#xff0c;会越来越复杂&#xff0c;变成一个大项目&#xff0c;如果前期项目架构没设计的不好&#xff0c;代码会越来越臃肿&#xff0c;难以维护&#xff0c;后期的每次产品迭代上线…

杂记---待整理

---恢复内容开始--- shell高亮显示 echo -e 终端颜色 显示内容 结束后的颜色 \e[1;31m content \e[1;0m 1为设置&#xff0c;0为不设置。 31m 0m为颜色 [ucmMacBook-Pro testpace]$ echo -e "\e[1;31m consumer huawei com \e[1;0m"consumer huawei com [ucmMacBook…

(转载)项目实战工具类(一):PhoneUtil(手机信息相关)

项目实战工具类&#xff08;一&#xff09;&#xff1a;PhoneUtil&#xff08;手机信息相关&#xff09; 可以使用的功能&#xff1a; 1、获取手机系统版本号 2、获取手机型号 3、获取手机宽度 4、获取手机高度 5、获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 6、…