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();
}
}
void methodA()
{
B b = new B();
b.methodB();
}
}
關聯:
class A {
B b = new B();
void methodA()
{
b.methodB();
}
}
B b = new B();
void methodA()
{
b.methodB();
}
}
Kyle Wang