UML中關(guān)聯(lián)(Association)和依賴(Dependency)的區(qū)別
原文轉(zhuǎn)自:http://blog.csdn.net/metasearch/article/details/2334853在UMLCHINA精華區(qū),看到了一些關(guān)聯(lián)和依賴的討論,似乎越講越糊涂.我想談一點(diǎn)自己的看法:
1、在《UML參考手冊(cè)》第37頁(yè)中,指出“關(guān)聯(lián)和泛化都是依賴關(guān)系,但是它們有更特別的語(yǔ)義,故它們有自己的名字和詳細(xì)的語(yǔ)義。我們通常用依賴這個(gè)詞來(lái)指其他的關(guān)系。”
2、在《UML參考手冊(cè)》30頁(yè)中,定義了關(guān)聯(lián)為“關(guān)聯(lián)描述了系統(tǒng)中對(duì)象或?qū)嵗g的離散連接。最普通的關(guān)聯(lián)是一對(duì)類元之間的二元關(guān)聯(lián)。關(guān)聯(lián)的實(shí)例之一是鏈。”
3、接著,又說(shuō)明了“關(guān)聯(lián)關(guān)系是整個(gè)系統(tǒng)中使用的“膠粘劑”,如果沒(méi)有它,那么只剩下不能一起工作的孤立的類。”
根據(jù)上述的分析,可以簡(jiǎn)單地作一個(gè)推論,僅對(duì)于這兩個(gè)關(guān)系來(lái)說(shuō),對(duì)象之間存在四種關(guān)系:
1、無(wú)關(guān)聯(lián),無(wú)依賴
它們是無(wú)關(guān)的對(duì)象類。
2、有關(guān)聯(lián),無(wú)依賴
一般用來(lái)為其它對(duì)象類導(dǎo)航到關(guān)聯(lián)端對(duì)象的橋梁。關(guān)聯(lián)對(duì)象之間除了相互存儲(chǔ)引用外,沒(méi)有進(jìn)一步的行為。也許,關(guān)聯(lián)引用在程序中沒(méi)有導(dǎo)航經(jīng)過(guò),這樣的話,可以取消關(guān)聯(lián)關(guān)系,就變成了(1)的情況。
3、無(wú)關(guān)聯(lián),有依賴
這是我們常常希望實(shí)現(xiàn)的松耦合關(guān)系的情景,對(duì)象之間沒(méi)有直接的關(guān)聯(lián)關(guān)系存在,所以它們沒(méi)有直接存儲(chǔ)對(duì)方的引用,使程序的可以更靈活地變動(dòng)。但是為了獲得對(duì) 象的引用以便實(shí)施依賴行為,比如調(diào)用,發(fā)消息,訪問(wèn)等依賴操作,可以通過(guò)間接關(guān)聯(lián)來(lái)定位對(duì)方。一般情況下,設(shè)計(jì)者會(huì)為依賴關(guān)系提供一個(gè)存取方法,獲取對(duì)象 引用。如果間接關(guān)聯(lián)無(wú)法到達(dá)彼此對(duì)方,那么這個(gè)依賴是不可實(shí)現(xiàn)的,這種“偽依賴”要么是程序設(shè)計(jì)的邏輯錯(cuò)誤(關(guān)系至少出現(xiàn)一個(gè)對(duì)象),要么是正常的 NULL對(duì)象(關(guān)系允許0個(gè)對(duì)象出現(xiàn))。
4、有關(guān)聯(lián),有依賴
當(dāng)然,這是最簡(jiǎn)單,也是最直接的實(shí)現(xiàn)了,它的意思也表達(dá)的最清楚。依賴的實(shí)施直接通過(guò)本身的關(guān)聯(lián)引用進(jìn)行。這時(shí),對(duì)象間的耦合關(guān)系確實(shí)比較強(qiáng)了,看需要是否解耦或不變。
============================================================================
對(duì)類而言依賴存在的理由有:B作為一個(gè)參數(shù)被傳遞給A眾所定義的一個(gè)方法(參數(shù)可見(jiàn)性);B在A的一個(gè)方法眾被聲明未局部對(duì)象(局部聲明可見(jiàn)性);B對(duì)A全局可見(jiàn)(全局可見(jiàn)性)
而關(guān)聯(lián)一般應(yīng)來(lái)描述普通的屬性可見(jiàn)性(B是A的一個(gè)屬性, 是一種相對(duì)長(zhǎng)久的可見(jiàn)性, 是普遍存在的,)
==============================================================================
依賴一般的表現(xiàn)方法是方法的局部變量,或者是方法內(nèi)對(duì)靜態(tài)方法的引用!
關(guān)聯(lián)一般的表現(xiàn)方法是對(duì)象的全局變量!
依賴:
class A {
void methodA()
{
B b = new B();
b.methodB();
}
}
void methodA()
{
B b = new B();
b.methodB();
}
}
關(guān)聯(lián):
class A {
B b = new B();
void methodA()
{
b.methodB();
}
}
B b = new B();
void methodA()
{
b.methodB();
}
}
Kyle Wang
posted on 2012-10-30 23:08 王樹(shù)東 閱讀(3537) 評(píng)論(0) 編輯 收藏