qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          UML中關聯,組合與聚合等關系的辨析

          以前學習面向對象的時候,常聽到介紹對象之間的各種關系,常見的有關聯,組合與聚合。

            關聯:

            關聯是一種最普遍和常見的關系形式。一般是指一個對象可以發消息給另外一個對象。典型的實現情況下指某個對象有一個指針或者引用指向一個實體變量,當通過方法的參數來傳遞或者創建本地變量來訪問這種情況也可以稱之為關聯。

            典型的代碼如下:

          1. class A  
          2. {  
          3.     private B itemB;  
          4. }

            也可能有如下的形式:

          1. class A  
          2. {  
          3.     void test(B b) {...}  
          4. }

            籠統的情況下,一般兩個對象的引用,參數傳遞等形式產生的關系,我們都可以稱之為關聯關系。

            聚合(aggregation):

            聚合表示的是一種has-a的關系,同時,它也是一種整體-部分關系。它的特點在于,它這個部分的生命周期并不由整體來管理。也就是說,當整體這個對象已經不存在的時候,部分的對象還是可能繼續存在的。它的uml圖表示形式如下:

            我們用一個空心的箭頭來表示聚合關系。

            籠統的說聲明周期管理還是比較模糊。我們就以如圖的Person和Address類來進一步的解釋。假設我們要定義這兩個對象,對于每個人來說,他有一個關聯的地址。人和地址的關系是has-a的關系。但是,我們不能說這個地址是這個人的一個組成部分。同時,我們建立地址對象和人的對象是可以相對獨立存在的。

            用代碼來表示的話,典型的代碼樣式如下:

          1. public class Address  
          2. {  
          3. . . .  
          4. }  
          5. public class Person  
          6. {  
          7.      private Address address;  
          8.      public Person(Address address)  
          9.      {  
          10.          this.address = address;  
          11.      }  
          12.      . . .  
          13. }



          我們通常通過如下的方式來使用Person對象:

          1. Address address = new Address();  
          2. Person person = new Person(address);

            或者:

          Person person = new Person( new Address() );

            我們可以看到,我們是創建了一個獨立的Address對象,然后將這個對象傳入了Person的構造函數。當Person對象聲明周期結束的時候,Address對象如果還有其他指向它的引用,是可能繼續存在的。也就是說,他們的聲明周期是相對獨立的。

            組合(Composition):

            當理解了聚合的關系之后,再來看組合的關系就相對來說要好很多。和聚合比起來,組合是一種更加嚴格的has-a關系。它表示一種嚴格的組成關系。以汽車和引擎為例子,引擎是汽車的一個組成部分。他們是一種嚴格的部分組成關系,因此他們的聲明周期也應該是一致的。也就是說引擎的聲明周期是通過汽車對象來管理。

            組合的uml圖表示如下:

            一般用一個實心的箭頭表示組合。

            組合代碼的典型示例如下:

          1. public class Engine  
          2. {  
          3. . . .   
          4. }  
          5.  
          6. public class Car  
          7. {  
          8.     Engine e = new Engine();  
          9.     .......  
          10. }

            Engine對象是在Car對象里面創建的,所以在Car對象生命周期結束的時候,Engine對象的生命周期也同樣結束了。

          posted on 2012-01-09 21:02 順其自然EVO 閱讀(211) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 禄丰县| 磐安县| 泗阳县| 五大连池市| 德保县| 资源县| 昆山市| 垫江县| 哈巴河县| 固始县| 抚顺市| 涪陵区| 湟源县| 叙永县| 泸州市| 新泰市| 屏山县| 大姚县| 株洲县| 万安县| 嵊泗县| 马边| 阜新市| 古交市| 左贡县| 郑州市| 达拉特旗| 北辰区| 山东| 延庆县| 新田县| 阿拉善盟| 全州县| 灵石县| 内黄县| 洛隆县| 买车| 西宁市| 巴彦淖尔市| 华蓥市| 长寿区|