原文轉(zhuǎn)自:http://blog.csdn.net/metasearch/article/details/2334853
在UMLCHINA精華區(qū),看到了一些關(guān)聯(lián)和依賴的討論,似乎越講越糊涂.我想談一點自己的看法:
1、在《UML參考手冊》第37頁中,指出“關(guān)聯(lián)和泛化都是依賴關(guān)系,但是它們有更特別的語義,故它們有自己的名字和詳細(xì)的語義。我們通常用依賴這個詞來指其他的關(guān)系。”
2、在《UML參考手冊》30頁中,定義了關(guān)聯(lián)為“關(guān)聯(lián)描述了系統(tǒng)中對象或?qū)嵗g的離散連接。最普通的關(guān)聯(lián)是一對類元之間的二元關(guān)聯(lián)。關(guān)聯(lián)的實例之一是鏈。”
3、接著,又說明了“關(guān)聯(lián)關(guān)系是整個系統(tǒng)中使用的“膠粘劑”,如果沒有它,那么只剩下不能一起工作的孤立的類。”
根據(jù)這三點引用,我們就可以知道關(guān)聯(lián)是類之間的“靜態(tài)”關(guān)系,只有通過這個關(guān)系的導(dǎo)航,一個對象才能找到另一個對象。它就象我們手中的通信錄,取得其他對象的聯(lián)系方法。除了這個職責(zé)之外,關(guān)聯(lián)沒有進一步的意義了。這時有人可能會問,我們總該用關(guān)聯(lián)(通信錄)為程序做點什么呀!不好意思,關(guān)聯(lián)除了能找到對方之外,別的什么都不懂了。因此,一般來說,關(guān)聯(lián)是用語言機制中的指針來實現(xiàn),可以在程序初始或運行是建立。當(dāng)然,也可以用任何標(biāo)識對象,并能在運行中定位對象的機制來實現(xiàn)。 依賴關(guān)系,簡單地來說就是“動態(tài)”的關(guān)系,提供者可能要求或指示依賴關(guān)系中客戶的變化,依賴者為了達成要求被依賴對象行動的目的,依賴首先要取得對方的引用,以便于實施這個依賴操作,對方對象的引用可以通過二種方法獲得,一種是依賴對象之間也存在關(guān)聯(lián)關(guān)系,所以它可以直接通過自己的關(guān)聯(lián)找到對方對象的引用,第二種是依賴對象之間不存在直接關(guān)聯(lián)關(guān)系,程序設(shè)計者有責(zé)任設(shè)計通過第三方對象的關(guān)聯(lián),經(jīng)過一次或多次的關(guān)聯(lián)導(dǎo)航獲得目標(biāo)對象的引用。最后,依賴對象通過這二種的任一種方法獲得目標(biāo)對象引用后,就可以向目標(biāo)對象施加相應(yīng)的依賴關(guān)系行為。 根據(jù)上述的分析,可以簡單地作一個推論,僅對于這兩個關(guān)系來說,對象之間存在四種關(guān)系:
1、無關(guān)聯(lián),無依賴
它們是無關(guān)的對象類。
2、有關(guān)聯(lián),無依賴
一般用來為其它對象類導(dǎo)航到關(guān)聯(lián)端對象的橋梁。關(guān)聯(lián)對象之間除了相互存儲引用外,沒有進一步的行為。也許,關(guān)聯(lián)引用在程序中沒有導(dǎo)航經(jīng)過,這樣的話,可以取消關(guān)聯(lián)關(guān)系,就變成了(1)的情況。
3、無關(guān)聯(lián),有依賴
這是我們常常希望實現(xiàn)的松耦合關(guān)系的情景,對象之間沒有直接的關(guān)聯(lián)關(guān)系存在,所以它們沒有直接存儲對方的引用,使程序的可以更靈活地變動。但是為了獲得對 象的引用以便實施依賴行為,比如調(diào)用,發(fā)消息,訪問等依賴操作,可以通過間接關(guān)聯(lián)來定位對方。一般情況下,設(shè)計者會為依賴關(guān)系提供一個存取方法,獲取對象 引用。如果間接關(guān)聯(lián)無法到達彼此對方,那么這個依賴是不可實現(xiàn)的,這種“偽依賴”要么是程序設(shè)計的邏輯錯誤(關(guān)系至少出現(xiàn)一個對象),要么是正常的 NULL對象(關(guān)系允許0個對象出現(xiàn))。
4、有關(guān)聯(lián),有依賴
當(dāng)然,這是最簡單,也是最直接的實現(xiàn)了,它的意思也表達的最清楚。依賴的實施直接通過本身的關(guān)聯(lián)引用進行。這時,對象間的耦合關(guān)系確實比較強了,看需要是否解耦或不變。
============================================================================
對類而言依賴存在的理由有:B作為一個參數(shù)被傳遞給A眾所定義的一個方法(參數(shù)可見性);B在A的一個方法眾被聲明未局部對象(局部聲明可見性);B對A全局可見(全局可見性)
而關(guān)聯(lián)一般應(yīng)來描述普通的屬性可見性(B是A的一個屬性, 是一種相對長久的可見性, 是普遍存在的,)
==============================================================================
依賴一般的表現(xiàn)方法是方法的局部變量,或者是方法內(nèi)對靜態(tài)方法的引用!
關(guān)聯(lián)一般的表現(xiàn)方法是對象的全局變量!
依賴:
class A {
void methodA()
{
B b = new B();
b.methodB();
}
}
關(guān)聯(lián):
class A {
B b = new B();
void methodA()
{
b.methodB();
}
}
Kyle Wang