UML中關聯(Association)和依賴(Dependency)的區別

          原文轉自:http://blog.csdn.net/metasearch/article/details/2334853

           在UMLCHINA精華區,看到了一些關聯和依賴的討論,似乎越講越糊涂.我想談一點自己的看法:
          1、在《UML參考手冊》第37頁中,指出“關聯和泛化都是依賴關系,但是它們有更特別的語義,故它們有自己的名字和詳細的語義。我們通常用依賴這個詞來指其他的關系。”
          2、在《UML參考手冊》30頁中,定義了關聯為“關聯描述了系統中對象或實例之間的離散連接。最普通的關聯是一對類元之間的二元關聯。關聯的實例之一是鏈。”
          3、接著,又說明了“關聯關系是整個系統中使用的“膠粘劑”,如果沒有它,那么只剩下不能一起工作的孤立的類。”

          根據這三點引用,我們就可以知道關聯是類之間的“靜態”關系,只有通過這個關系的導航,一個對象才能找到另一個對象。它就象我們手中的通信錄,取得其他對象的聯系方法。除了這個職責之外,關聯沒有進一步的意義了。這時有人可能會問,我們總該用關聯(通信錄)為程序做點什么呀!不好意思,關聯除了能找到對方之外,別的什么都不懂了。因此,一般來說,關聯是用語言機制中的指針來實現,可以在程序初始或運行是建立。當然,也可以用任何標識對象,并能在運行中定位對象的機制來實現。
          依賴關系,簡單地來說就是“動態”的關系,提供者可能要求或指示依賴關系中客戶的變化,依賴者為了達成要求被依賴對象行動的目的,依賴首先要取得對方的引用,以便于實施這個依賴操作,對方對象的引用可以通過二種方法獲得,一種是依賴對象之間也存在關聯關系,所以它可以直接通過自己的關聯找到對方對象的引用,第二種是依賴對象之間不存在直接關聯關系,程序設計者有責任設計通過第三方對象的關聯,經過一次或多次的關聯導航獲得目標對象的引用。最后,依賴對象通過這二種的任一種方法獲得目標對象引用后,就可以向目標對象施加相應的依賴關系行為
          根據上述的分析,可以簡單地作一個推論,僅對于這兩個關系來說,對象之間存在四種關系:
          1、無關聯,無依賴
          它們是無關的對象類。
          2、有關聯,無依賴
          一般用來為其它對象類導航到關聯端對象的橋梁。關聯對象之間除了相互存儲引用外,沒有進一步的行為。也許,關聯引用在程序中沒有導航經過,這樣的話,可以取消關聯關系,就變成了(1)的情況。
          3、無關聯,有依賴
          這是我們常常希望實現的松耦合關系的情景,對象之間沒有直接的關聯關系存在,所以它們沒有直接存儲對方的引用,使程序的可以更靈活地變動。但是為了獲得對 象的引用以便實施依賴行為,比如調用,發消息,訪問等依賴操作,可以通過間接關聯來定位對方。一般情況下,設計者會為依賴關系提供一個存取方法,獲取對象 引用。如果間接關聯無法到達彼此對方,那么這個依賴是不可實現的,這種“偽依賴”要么是程序設計的邏輯錯誤(關系至少出現一個對象),要么是正常的 NULL對象(關系允許0個對象出現)。
          4、有關聯,有依賴
          當然,這是最簡單,也是最直接的實現了,它的意思也表達的最清楚。依賴的實施直接通過本身的關聯引用進行。這時,對象間的耦合關系確實比較強了,看需要是否解耦或不變。
          ============================================================================
          對類而言依賴存在的理由有:B作為一個參數被傳遞給A眾所定義的一個方法(參數可見性);B在A的一個方法眾被聲明未局部對象(局部聲明可見性);B對A全局可見(全局可見性)
          而關聯一般應來描述普通的屬性可見性(B是A的一個屬性, 是一種相對長久的可見性, 是普遍存在的,)
          ==============================================================================
          依賴一般的表現方法是方法的局部變量,或者是方法內對靜態方法的引用!
          關聯一般的表現方法是對象的全局變量!
          依賴:
            class   A  {   
                  void   methodA()   
                  {   
                          B   b   =   new   B();   
                          b.methodB();     
                  }   
            } 

          關聯:

           class A {   
                  B   b   =   new   B();   
                  void   methodA()   
                  {   
                        b.methodB();   
                  }   
            } 


          Kyle Wang

          posted on 2012-10-30 23:08 王樹東 閱讀(3546) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          公告

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(15)

          文章分類(4)

          文章檔案(5)

          收藏夾(4)

          Algorithm

          Design

          Environment Setup

          Installer

          Maven

          MINA

          OS

          Skills for Java

          VIM

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 赤壁市| 五河县| 措勤县| 齐河县| 抚宁县| 石狮市| 麻栗坡县| 牙克石市| 合山市| 白朗县| 墨脱县| 开阳县| 儋州市| 武宣县| 楚雄市| 汕尾市| 寿宁县| 诏安县| 金溪县| 吴桥县| 高碑店市| 都江堰市| 阳江市| 抚顺市| 巴楚县| 忻城县| 湖口县| 措美县| 孟州市| 建水县| 凤台县| 衡山县| 西安市| 乌拉特中旗| 康保县| 彰武县| 新建县| 佳木斯市| 文登市| 三亚市| 天等县|