以前學習面向對象的時候,常聽到介紹對象之間的各種關系,常見的有關聯,組合與聚合。
關聯:
關聯是一種最普遍和常見的關系形式。一般是指一個對象可以發消息給另外一個對象。典型的實現情況下指某個對象有一個指針或者引用指向一個實體變量,當通過方法的參數來傳遞或者創建本地變量來訪問這種情況也可以稱之為關聯。
典型的代碼如下:
- class A
- {
- private B itemB;
- }
也可能有如下的形式:
- class A
- {
- void test(B b) {...}
- }
籠統的情況下,一般兩個對象的引用,參數傳遞等形式產生的關系,我們都可以稱之為關聯關系。
聚合(aggregation):
聚合表示的是一種has-a的關系,同時,它也是一種整體-部分關系。它的特點在於,它這個部分的生命周期並不由整體來管理。也就是說,當整體這個對象已經不存在的時候,部分的對象還是可能繼續存在的。它的UML圖表示形式如下:
我們用一個空心的箭頭來表示聚合關系。
籠統的說聲明周期管理還是比較模糊。我們就以如圖的Person和Address類來進一步的解釋。假設我們要定義這兩個對象,對於每個人來說,他有一個關聯的地址。人和地址的關系是has-a的關系。但是,我們不能說這個地址是這個人的一個組成部分。同時,我們建立地址對象和人的對象是可以相對獨立存在的。
用代碼來表示的話,典型的代碼樣式如下:
- public class Address
- {
- . . .
- }
- public class Person
- {
- private Address address;
- public Person(Address address)
- {
- this.address = address;
- }
- . . .
- }
我們通常通過如下的方式來使用Person對象:
- Address address = new Address();
- Person person = new Person(address);
或者:
- Person person = new Person( new Address() );
我們可以看到,我們是創建了一個獨立的Address對象,然後將這個對象傳入了Person的構造函數。當Person對象聲明周期結束的時候,Address對象如果還有其他指向它的引用,是可能繼續存在的。也就是說,他們的聲明周期是相對獨立的。
組合(Composition):
當理解了聚合的關系之後,再來看組合的關系就相對來說要好很多。和聚合比起來,組合是一種更加嚴格的has-a關系。它表示一種嚴格的組成關系。以汽車和引擎為例子,引擎是汽車的一個組成部分。他們是一種嚴格的部分組成關系,因此他們的聲明周期也應該是一致的。也就是說引擎的聲明周期是通過汽車對象來管理。
組合的UML圖表示如下:
一般用一個實心的箭頭表示組合。
組合代碼的典型示例如下:
- public class Engine
- {
- . . .
- }
- public class Car
- {
- Engine e = new Engine();
- .......
- }
Engine對象是在Car對象裡面創建的,所以在Car對象生命周期結束的時候,Engine對象的生命周期也同樣結束了。
參考鏈接:
http://www.c-sharpcorner.com/UploadFile/pcurnow/compagg07272007062838AM/compagg.ASPx
http://ootips.org/UML-hasa.Html