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.pswp.cn/news/253613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253613.shtml
英文地址,請注明出處:http://en.pswp.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、…