掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
以前學(xué)習(xí)面向?qū)ο蟮臅r(shí)候,常聽到介紹對(duì)象之間的各種關(guān)系,常見的有關(guān)聯(lián),組合與聚合。

關(guān)聯(lián):
關(guān)聯(lián)是一種最普遍和常見的關(guān)系形式。一般是指一個(gè)對(duì)象可以發(fā)消息給另外一個(gè)對(duì)象。典型的實(shí)現(xiàn)情況下指某個(gè)對(duì)象有一個(gè)指針或者引用指向一個(gè)實(shí)體變量,當(dāng)通過(guò)方法的參數(shù)來(lái)傳遞或者創(chuàng)建本地變量來(lái)訪問(wèn)這種情況也可以稱之為關(guān)聯(lián)。
典型的代碼如下:
- class A
- {
- private B itemB;
- }
也可能有如下的形式:
- class A
- {
- void test(B b) {...}
- }
籠統(tǒng)的情況下,一般兩個(gè)對(duì)象的引用,參數(shù)傳遞等形式產(chǎn)生的關(guān)系,我們都可以稱之為關(guān)聯(lián)關(guān)系。
聚合(aggregation):
聚合表示的是一種has-a的關(guān)系,同時(shí),它也是一種整體-部分關(guān)系。它的特點(diǎn)在于,它這個(gè)部分的生命周期并不由整體來(lái)管理。也就是說(shuō),當(dāng)整體這個(gè)對(duì)象已經(jīng)不存在的時(shí)候,部分的對(duì)象還是可能繼續(xù)存在的。它的uml圖表示形式如下:
我們用一個(gè)空心的箭頭來(lái)表示聚合關(guān)系。
籠統(tǒng)的說(shuō)聲明周期管理還是比較模糊。我們就以如圖的Person和Address類來(lái)進(jìn)一步的解釋。假設(shè)我們要定義這兩個(gè)對(duì)象,對(duì)于每個(gè)人來(lái)說(shuō),他有一個(gè)關(guān)聯(lián)的地址。人和地址的關(guān)系是has-a的關(guān)系。但是,我們不能說(shuō)這個(gè)地址是這個(gè)人的一個(gè)組成部分。同時(shí),我們建立地址對(duì)象和人的對(duì)象是可以相對(duì)獨(dú)立存在的。
用代碼來(lái)表示的話,典型的代碼樣式如下:
- public class Address
- {
- . . .
- }
- public class Person
- {
- private Address address;
- public Person(Address address)
- {
- this.address = address;
- }
- . . .
- }
我們通常通過(guò)如下的方式來(lái)使用Person對(duì)象:
- Address address = new Address();
- Person person = new Person(address);
或者:
- Person person = new Person( new Address() );
我們可以看到,我們是創(chuàng)建了一個(gè)獨(dú)立的Address對(duì)象,然后將這個(gè)對(duì)象傳入了Person的構(gòu)造函數(shù)。當(dāng)Person對(duì)象聲明周期結(jié)束的時(shí)候,Address對(duì)象如果還有其他指向它的引用,是可能繼續(xù)存在的。也就是說(shuō),他們的聲明周期是相對(duì)獨(dú)立的。
組合(Composition):
當(dāng)理解了聚合的關(guān)系之后,再來(lái)看組合的關(guān)系就相對(duì)來(lái)說(shuō)要好很多。和聚合比起來(lái),組合是一種更加嚴(yán)格的has-a關(guān)系。它表示一種嚴(yán)格的組成關(guān)系。以汽車和引擎為例子,引擎是汽車的一個(gè)組成部分。他們是一種嚴(yán)格的部分組成關(guān)系,因此他們的聲明周期也應(yīng)該是一致的。也就是說(shuō)引擎的聲明周期是通過(guò)汽車對(duì)象來(lái)管理。
組合的uml圖表示如下:
一般用一個(gè)實(shí)心的箭頭表示組合。
組合代碼的典型示例如下:
- public class Engine
- {
- . . .
- }
- public class Car
- {
- Engine e = new Engine();
- .......
- }
Engine對(duì)象是在Car對(duì)象里面創(chuàng)建的,所以在Car對(duì)象生命周期結(jié)束的時(shí)候,Engine對(duì)象的生命周期也同樣結(jié)束了。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流