當(dāng)前位置:
首頁(yè) >
UML类关系(依赖,关联,聚合,组合,泛化,实现)
發(fā)布時(shí)間:2025/6/17
53
豆豆
生活随笔
收集整理的這篇文章主要介紹了
UML类关系(依赖,关联,聚合,组合,泛化,实现)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自https://blog.csdn.net/k346k346/article/details/59582926 在學(xué)習(xí)面向?qū)ο笤O(shè)計(jì)時(shí),類(lèi)關(guān)系涉及依賴(lài)、關(guān)聯(lián)、聚合、組合和泛化這五種關(guān)系,耦合度依次遞增。關(guān)于耦合度,可以簡(jiǎn)單地理解為當(dāng)一個(gè)類(lèi)發(fā)生變更時(shí),對(duì)其他類(lèi)造成的影響程度,影響越小則耦合度越弱,影響越大耦合度越強(qiáng)。 下面根據(jù)個(gè)人理解,嘗試講解這五種類(lèi)關(guān)系。 1.依賴(lài)(Dependency) 依賴(lài)關(guān)系使用虛線(xiàn)加箭頭表示,如下圖所示:
學(xué)生在學(xué)習(xí)生活中經(jīng)常使用電腦,于是對(duì)電腦產(chǎn)生了依賴(lài)。依賴(lài)關(guān)系是五種關(guān)系中耦合最小的一種關(guān)系。類(lèi)A要完成某個(gè)功能引用了類(lèi)B,則類(lèi)A依賴(lài)類(lèi)B。依賴(lài)在代碼中主要體現(xiàn)為類(lèi)A的某個(gè)成員方法的返回值、形參、局部變量或靜態(tài)方法的調(diào)用,則表示類(lèi)A引用了類(lèi)B。以Student類(lèi)和Computer類(lèi)為例,用C++語(yǔ)言編碼如下: class Computer{ public:static void start(){cout<<"電腦正在啟動(dòng)"<<endl;} }; class Student{ public://返回值構(gòu)成依賴(lài)Computer& program();//形參構(gòu)成依賴(lài)void program(Computer&);//局部變量構(gòu)成依賴(lài)void playGame(){Computer* computer=new Computer;...}//靜態(tài)方法調(diào)用構(gòu)成依賴(lài)Computer::star(); }; 2.關(guān)聯(lián)(Association) 關(guān)聯(lián)關(guān)系使用實(shí)線(xiàn)加箭頭表示,類(lèi)之間的關(guān)系比依賴(lài)要強(qiáng)。學(xué)生與老師是關(guān)聯(lián)的,學(xué)生可以不用電腦,但是學(xué)生不能沒(méi)有老師。如下圖所示:
關(guān)聯(lián)與依賴(lài)的對(duì)比:
相似之處:
關(guān)聯(lián)暗示了依賴(lài),二者都用來(lái)表示無(wú)法用聚合和組合表示的關(guān)系。 區(qū)別:
(1)發(fā)生依賴(lài)關(guān)系的兩個(gè)類(lèi)都不會(huì)增加屬性。其中的一個(gè)類(lèi)作為另一個(gè)類(lèi)的方法的參數(shù)或者返回值,或者是某個(gè)方法的變量而已。 發(fā)生關(guān)聯(lián)關(guān)系的兩個(gè)類(lèi),類(lèi)A成為類(lèi)B的屬性,而屬性是一種更為緊密的耦合,更為長(zhǎng)久的持有關(guān)系。 在代碼中的表現(xiàn)如下: class Teacher; class Student{ public:Teacher teacher; //成員變量void study(); } (2)從關(guān)系的生命周期來(lái)看,依賴(lài)關(guān)系是僅當(dāng)類(lèi)的方法被調(diào)用時(shí)而產(chǎn)生,伴隨著方法的結(jié)束而結(jié)束。關(guān)聯(lián)關(guān)系當(dāng)類(lèi)實(shí)例化的時(shí)候產(chǎn)生,當(dāng)類(lèi)對(duì)象銷(xiāo)毀的時(shí)候關(guān)系結(jié)束。相比依賴(lài),關(guān)聯(lián)關(guān)系的生存期更長(zhǎng)。 關(guān)聯(lián)關(guān)系有單向關(guān)聯(lián)、雙向關(guān)聯(lián)、自身關(guān)聯(lián)、多維關(guān)聯(lián)等等。其中后三個(gè)可以不加箭頭。
單向關(guān)聯(lián): 雙向關(guān)聯(lián):
自身關(guān)聯(lián):
多維關(guān)聯(lián):
3.聚合(Aggregation) 聚合關(guān)系使用實(shí)線(xiàn)加空心菱形表示。聚合用來(lái)表示集體與個(gè)體之間的關(guān)聯(lián)關(guān)系。例如班級(jí)與學(xué)生之間存在聚合關(guān)系,類(lèi)圖表示如下:
聚合關(guān)系在代碼上與關(guān)聯(lián)關(guān)系表現(xiàn)一致,類(lèi)Student將成為類(lèi)Classes的成員變量。代碼如下: class Student; class Classes{ public:Student* student; Classes(Student* stu):student(stu){} }; 4.組合(復(fù)合,Composition) 復(fù)合關(guān)系使用實(shí)線(xiàn)加實(shí)心菱形表示。組合又叫復(fù)合,用來(lái)表示個(gè)體與組成部分之間的關(guān)聯(lián)關(guān)系。例如學(xué)生與心臟之間存在復(fù)合關(guān)系,類(lèi)圖表示如下:
組合關(guān)系在代碼上與關(guān)聯(lián)關(guān)系表現(xiàn)一致,類(lèi)Heart將成為類(lèi)Student的成員變量。代碼如下: class Heart; class Student{ public:Heart* heart; Student(){heart=new Heart;}~Student(){delete heart;} }; 聚合與組合的對(duì)比:
(1)聚合關(guān)系沒(méi)有組合緊密。
學(xué)生不會(huì)因?yàn)榘嗉?jí)的解散而無(wú)法存在,聚合關(guān)系的類(lèi)具有不同的生命周期;而學(xué)生如果沒(méi)有心臟將無(wú)法存活,組合關(guān)系的類(lèi)具有相同的生命周期。 這個(gè)從構(gòu)造函數(shù)可以看出。聚合類(lèi)的構(gòu)造函數(shù)中包含另一個(gè)類(lèi)的實(shí)例作為參數(shù),因?yàn)闃?gòu)造函數(shù)中傳遞另一個(gè)類(lèi)的實(shí)例,因此學(xué)生可以脫離班級(jí)體獨(dú)立存在。組合類(lèi)的構(gòu)造函數(shù)包含另一個(gè)類(lèi)的實(shí)例化。因?yàn)樵跇?gòu)造函數(shù)中進(jìn)行實(shí)例化,因此兩者緊密耦合在一起,同生同滅,學(xué)生不能脫離心臟而存在。
(2)信息的封裝性不同。
在聚合關(guān)系中,客戶(hù)端可以同時(shí)了解Classes類(lèi)和Student類(lèi),因?yàn)樗麄兪仟?dú)立的。 在組合關(guān)系中,客戶(hù)端只認(rèn)識(shí)Student類(lèi),根本不知道Heart類(lèi)的存在,因?yàn)樾呐K類(lèi)被嚴(yán)密地封裝在學(xué)生類(lèi)中。 理解聚合與復(fù)合的區(qū)別,主要在于聚合的成員可獨(dú)立,復(fù)合的成員必須依賴(lài)于整體才有意義。 5.泛化(Generalization) 泛化是學(xué)術(shù)名稱(chēng),通俗的來(lái)講,泛化指的是類(lèi)與類(lèi)之間的繼承關(guān)系和類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系。 繼承關(guān)系使用直線(xiàn)加空心三角形表示。類(lèi)圖結(jié)構(gòu)如下:
類(lèi)接口的實(shí)現(xiàn)關(guān)系使用虛線(xiàn)加空心三角形表示。類(lèi)圖結(jié)構(gòu)如下:
6.小結(jié) 依賴(lài)、關(guān)聯(lián)、聚合、組合與泛化代表類(lèi)與類(lèi)之間的耦合度依次遞增。依賴(lài)關(guān)系實(shí)際上是一種比較弱的關(guān)聯(lián),聚合是一種比較強(qiáng)的關(guān)聯(lián),組合是一種更強(qiáng)的關(guān)聯(lián),泛化則是一種最強(qiáng)的關(guān)聯(lián),所以籠統(tǒng)的來(lái)區(qū)分的話(huà),實(shí)際上這五種關(guān)系都是關(guān)聯(lián)關(guān)系。 依賴(lài)關(guān)系比較好區(qū)分,它是耦合度最弱的一種,在編碼中表現(xiàn)為類(lèi)成員函數(shù)的局部變量、形參、返回值或?qū)o態(tài)方法的調(diào)用。 關(guān)聯(lián)、聚合與組合在編碼形式上都以類(lèi)成員變量的形式來(lái)表示,所以只給出一段代碼我們很難判斷出是關(guān)聯(lián)、聚合還是組合關(guān)系,我們需要從上下文語(yǔ)境中來(lái)判別。關(guān)聯(lián)表示類(lèi)之間存在聯(lián)系,不存在集體與個(gè)體、個(gè)體與組成部分之間的關(guān)系。聚合表示類(lèi)之間存在集體與個(gè)體的關(guān)系。組合表示個(gè)體與組成部分之間的關(guān)系。 依賴(lài)、關(guān)聯(lián)、聚合與組合是邏輯上的關(guān)聯(lián),泛化是物理上的關(guān)聯(lián)。物理上的關(guān)聯(lián)指定是類(lèi)體的耦合,所以類(lèi)間耦合性最強(qiáng)。
學(xué)生在學(xué)習(xí)生活中經(jīng)常使用電腦,于是對(duì)電腦產(chǎn)生了依賴(lài)。依賴(lài)關(guān)系是五種關(guān)系中耦合最小的一種關(guān)系。類(lèi)A要完成某個(gè)功能引用了類(lèi)B,則類(lèi)A依賴(lài)類(lèi)B。依賴(lài)在代碼中主要體現(xiàn)為類(lèi)A的某個(gè)成員方法的返回值、形參、局部變量或靜態(tài)方法的調(diào)用,則表示類(lèi)A引用了類(lèi)B。以Student類(lèi)和Computer類(lèi)為例,用C++語(yǔ)言編碼如下: class Computer{ public:static void start(){cout<<"電腦正在啟動(dòng)"<<endl;} }; class Student{ public://返回值構(gòu)成依賴(lài)Computer& program();//形參構(gòu)成依賴(lài)void program(Computer&);//局部變量構(gòu)成依賴(lài)void playGame(){Computer* computer=new Computer;...}//靜態(tài)方法調(diào)用構(gòu)成依賴(lài)Computer::star(); }; 2.關(guān)聯(lián)(Association) 關(guān)聯(lián)關(guān)系使用實(shí)線(xiàn)加箭頭表示,類(lèi)之間的關(guān)系比依賴(lài)要強(qiáng)。學(xué)生與老師是關(guān)聯(lián)的,學(xué)生可以不用電腦,但是學(xué)生不能沒(méi)有老師。如下圖所示:
關(guān)聯(lián)與依賴(lài)的對(duì)比:
相似之處:
關(guān)聯(lián)暗示了依賴(lài),二者都用來(lái)表示無(wú)法用聚合和組合表示的關(guān)系。 區(qū)別:
(1)發(fā)生依賴(lài)關(guān)系的兩個(gè)類(lèi)都不會(huì)增加屬性。其中的一個(gè)類(lèi)作為另一個(gè)類(lèi)的方法的參數(shù)或者返回值,或者是某個(gè)方法的變量而已。 發(fā)生關(guān)聯(lián)關(guān)系的兩個(gè)類(lèi),類(lèi)A成為類(lèi)B的屬性,而屬性是一種更為緊密的耦合,更為長(zhǎng)久的持有關(guān)系。 在代碼中的表現(xiàn)如下: class Teacher; class Student{ public:Teacher teacher; //成員變量void study(); } (2)從關(guān)系的生命周期來(lái)看,依賴(lài)關(guān)系是僅當(dāng)類(lèi)的方法被調(diào)用時(shí)而產(chǎn)生,伴隨著方法的結(jié)束而結(jié)束。關(guān)聯(lián)關(guān)系當(dāng)類(lèi)實(shí)例化的時(shí)候產(chǎn)生,當(dāng)類(lèi)對(duì)象銷(xiāo)毀的時(shí)候關(guān)系結(jié)束。相比依賴(lài),關(guān)聯(lián)關(guān)系的生存期更長(zhǎng)。 關(guān)聯(lián)關(guān)系有單向關(guān)聯(lián)、雙向關(guān)聯(lián)、自身關(guān)聯(lián)、多維關(guān)聯(lián)等等。其中后三個(gè)可以不加箭頭。
單向關(guān)聯(lián): 雙向關(guān)聯(lián):
自身關(guān)聯(lián):
多維關(guān)聯(lián):
3.聚合(Aggregation) 聚合關(guān)系使用實(shí)線(xiàn)加空心菱形表示。聚合用來(lái)表示集體與個(gè)體之間的關(guān)聯(lián)關(guān)系。例如班級(jí)與學(xué)生之間存在聚合關(guān)系,類(lèi)圖表示如下:
聚合關(guān)系在代碼上與關(guān)聯(lián)關(guān)系表現(xiàn)一致,類(lèi)Student將成為類(lèi)Classes的成員變量。代碼如下: class Student; class Classes{ public:Student* student; Classes(Student* stu):student(stu){} }; 4.組合(復(fù)合,Composition) 復(fù)合關(guān)系使用實(shí)線(xiàn)加實(shí)心菱形表示。組合又叫復(fù)合,用來(lái)表示個(gè)體與組成部分之間的關(guān)聯(lián)關(guān)系。例如學(xué)生與心臟之間存在復(fù)合關(guān)系,類(lèi)圖表示如下:
組合關(guān)系在代碼上與關(guān)聯(lián)關(guān)系表現(xiàn)一致,類(lèi)Heart將成為類(lèi)Student的成員變量。代碼如下: class Heart; class Student{ public:Heart* heart; Student(){heart=new Heart;}~Student(){delete heart;} }; 聚合與組合的對(duì)比:
(1)聚合關(guān)系沒(méi)有組合緊密。
學(xué)生不會(huì)因?yàn)榘嗉?jí)的解散而無(wú)法存在,聚合關(guān)系的類(lèi)具有不同的生命周期;而學(xué)生如果沒(méi)有心臟將無(wú)法存活,組合關(guān)系的類(lèi)具有相同的生命周期。 這個(gè)從構(gòu)造函數(shù)可以看出。聚合類(lèi)的構(gòu)造函數(shù)中包含另一個(gè)類(lèi)的實(shí)例作為參數(shù),因?yàn)闃?gòu)造函數(shù)中傳遞另一個(gè)類(lèi)的實(shí)例,因此學(xué)生可以脫離班級(jí)體獨(dú)立存在。組合類(lèi)的構(gòu)造函數(shù)包含另一個(gè)類(lèi)的實(shí)例化。因?yàn)樵跇?gòu)造函數(shù)中進(jìn)行實(shí)例化,因此兩者緊密耦合在一起,同生同滅,學(xué)生不能脫離心臟而存在。
(2)信息的封裝性不同。
在聚合關(guān)系中,客戶(hù)端可以同時(shí)了解Classes類(lèi)和Student類(lèi),因?yàn)樗麄兪仟?dú)立的。 在組合關(guān)系中,客戶(hù)端只認(rèn)識(shí)Student類(lèi),根本不知道Heart類(lèi)的存在,因?yàn)樾呐K類(lèi)被嚴(yán)密地封裝在學(xué)生類(lèi)中。 理解聚合與復(fù)合的區(qū)別,主要在于聚合的成員可獨(dú)立,復(fù)合的成員必須依賴(lài)于整體才有意義。 5.泛化(Generalization) 泛化是學(xué)術(shù)名稱(chēng),通俗的來(lái)講,泛化指的是類(lèi)與類(lèi)之間的繼承關(guān)系和類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系。 繼承關(guān)系使用直線(xiàn)加空心三角形表示。類(lèi)圖結(jié)構(gòu)如下:
類(lèi)接口的實(shí)現(xiàn)關(guān)系使用虛線(xiàn)加空心三角形表示。類(lèi)圖結(jié)構(gòu)如下:
6.小結(jié) 依賴(lài)、關(guān)聯(lián)、聚合、組合與泛化代表類(lèi)與類(lèi)之間的耦合度依次遞增。依賴(lài)關(guān)系實(shí)際上是一種比較弱的關(guān)聯(lián),聚合是一種比較強(qiáng)的關(guān)聯(lián),組合是一種更強(qiáng)的關(guān)聯(lián),泛化則是一種最強(qiáng)的關(guān)聯(lián),所以籠統(tǒng)的來(lái)區(qū)分的話(huà),實(shí)際上這五種關(guān)系都是關(guān)聯(lián)關(guān)系。 依賴(lài)關(guān)系比較好區(qū)分,它是耦合度最弱的一種,在編碼中表現(xiàn)為類(lèi)成員函數(shù)的局部變量、形參、返回值或?qū)o態(tài)方法的調(diào)用。 關(guān)聯(lián)、聚合與組合在編碼形式上都以類(lèi)成員變量的形式來(lái)表示,所以只給出一段代碼我們很難判斷出是關(guān)聯(lián)、聚合還是組合關(guān)系,我們需要從上下文語(yǔ)境中來(lái)判別。關(guān)聯(lián)表示類(lèi)之間存在聯(lián)系,不存在集體與個(gè)體、個(gè)體與組成部分之間的關(guān)系。聚合表示類(lèi)之間存在集體與個(gè)體的關(guān)系。組合表示個(gè)體與組成部分之間的關(guān)系。 依賴(lài)、關(guān)聯(lián)、聚合與組合是邏輯上的關(guān)聯(lián),泛化是物理上的關(guān)聯(lián)。物理上的關(guān)聯(lián)指定是類(lèi)體的耦合,所以類(lèi)間耦合性最強(qiáng)。
轉(zhuǎn)載于:https://www.cnblogs.com/MY0213/p/9938637.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的UML类关系(依赖,关联,聚合,组合,泛化,实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows 64位下为wampser
- 下一篇: flutter布局-8-animated