java uml聚合代码_UML类图(下):关联、聚合、组合、依赖
前言
上一篇文章UML類圖(上):類、繼承、實現(xiàn),講了UML類圖中類、繼承、實現(xiàn)三種關(guān)系及其在UML類圖中的畫法,本文將接著上文的內(nèi)容,繼續(xù)講講對象之間的其他幾種關(guān)系,主要就是關(guān)聯(lián)、聚合、組合、依賴,下面開始文章的內(nèi)容。
注意1:子類中覆蓋了父類的abstract方法,方法名再次出現(xiàn)。
注意2:無論哪種關(guān)系,箭頭指向被依賴方。
關(guān)聯(lián)關(guān)系
關(guān)聯(lián)(Assocition)關(guān)系是類與類之間最常見的一種關(guān)系,它是一種結(jié)構(gòu)化的關(guān)系,表示一類對象與另一類對象之間有聯(lián)系,如汽車和輪胎、師傅和徒弟、班級和學(xué)生等。在UML類圖中,用實線連接有關(guān)聯(lián)關(guān)系的對象所對應(yīng)的類,在Java中通常將一個類的對象作為另一個類的成員變量。關(guān)聯(lián)關(guān)系分單向關(guān)聯(lián)、雙向關(guān)聯(lián)、自關(guān)聯(lián),逐一看一下。
1、單向關(guān)聯(lián)關(guān)系
單向關(guān)聯(lián)指的是關(guān)聯(lián)只有一個方向,比如顧客(Customer)擁有地址(Address),其Java實現(xiàn)為:
public classAddress
{
}
public classCustomer
{privateAddress address;
}
UML的畫法為:
2、雙向關(guān)聯(lián)關(guān)系
默認情況下的關(guān)聯(lián)都是雙向的,比如顧客(Customer)購買商品(Product),反之,賣出去的商品總是與某個顧客與之相關(guān)聯(lián),這就是雙向關(guān)聯(lián)。Java類的寫法為:
public classProduct
{privateCustomer customer;
}
public classCustomer
{privateProduct[] product;
}
對應(yīng)的UML類圖應(yīng)當是:
3、自關(guān)聯(lián)關(guān)系
自關(guān)聯(lián),指的就是對象中的屬性為對象本身,這在鏈表中非常常見,單向鏈表Node中會維護一個它的前驅(qū)Node,雙向鏈表Node中會維護一個它的前驅(qū)Node和一個它的后繼Node。就以單向鏈表為例,它的Java寫法為:
public classNode
{privateNode nextNode;
}
對應(yīng)的UML類圖應(yīng)當是:
聚合關(guān)系
聚合(Aggregation)關(guān)系表示整體與部分的關(guān)系。在聚合關(guān)系中,成員對象是整體的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關(guān)系用帶空心菱形的直線表示,如汽車(Car)與引擎(Engine)、輪胎(Wheel)、車燈(Light),Java表示為:
public classEngine
{
}
public classWheel
{
}
public classLight
{
}
public classCar
{privateEngine engine;privateLight light;privateWheel wheel;publicCar(Engine engine, Light light, Wheel wheel)
{super();this.engine =engine;this.light =light;this.wheel =wheel;
}public voiddrive()
{
}
}
對應(yīng)的UML類圖為:
代碼實現(xiàn)聚合關(guān)系,成員對象通常以構(gòu)造方法、Setter方法的方式注入到整體對象之中。
組合關(guān)系
組合(Composition)關(guān)系也表示的是一種整體和部分的關(guān)系,但是在組合關(guān)系中整體對象可以控制成員對象的生命周期,一旦整體對象不存在,成員對象也不存在,整體對象和成員對象之間具有同生共死的關(guān)系。在UML中組合關(guān)系用帶實心菱形的直線表示。
比如人的頭(Head)和嘴巴(Mouth)、鼻子(Nose),嘴巴和鼻子是頭的組成部分之一,一旦頭沒了,嘴巴也沒了,因此頭和嘴巴、鼻子是組合關(guān)系,Java表示為:
public classMouth
{
}
public classNose
{
}
public classHead
{privateMouth mouth;privateNose nose;publicHead()
{
mouth= newMouth();
nose= newNose();
}public voidshake()
{
}
}
其UML的表示方法為:
代碼實現(xiàn)組合關(guān)系,通常在整體類的構(gòu)造方法中直接實例化成員類,這是因為組合關(guān)系的整體和部分是共生關(guān)系,如果通過外部注入,那么即使整體不存在,那么部分還是存在的,這就相當于變成了一種聚合關(guān)系了。
依賴關(guān)系
依賴(Dependency)關(guān)系是一種使用關(guān)系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關(guān)系,大多數(shù)情況下依賴關(guān)系體現(xiàn)在某個類的方法使用另一個類的對象作為參數(shù)。在UML中,依賴關(guān)系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
比如,駕駛員(Driver)開車,Driver類的drive()方法將車(Car)的對象作為一個參數(shù)傳遞,以便在drive()方法中能夠調(diào)用car的move()方法,且駕駛員的drive()方法依賴車的move()方法,因此也可以說Driver依賴Car,Java代碼為:
public interfaceCar
{public voidmove();
}
public classDriver
{public voiddrive(Car car)
{
car.move();
}
}
其UML的畫法為:
依賴關(guān)系通常通過三種方式來實現(xiàn):將一個類的對象作為另一個類中方法的參數(shù)
在一個類的方法中將另一個類的對象作為其對象的局部變量
在一個類的方法中調(diào)用另一個類的靜態(tài)方法
關(guān)聯(lián)關(guān)系、聚合關(guān)系、組合關(guān)系之間的區(qū)別
從上文可以看出,關(guān)聯(lián)關(guān)系、聚合關(guān)系和組合關(guān)系三者之間比較相似,本文的最后就來總結(jié)一下這三者之間的區(qū)別。
關(guān)聯(lián)和聚合的區(qū)別主要在于語義上:關(guān)聯(lián)的兩個對象之間一般是平等的,聚合則一般是不平等的。
聚合和組合的區(qū)別則在語義和實現(xiàn)上都有差別:組合的兩個對象之間生命周期有很大的關(guān)聯(lián),被組合的對象在組合對象創(chuàng)建的同時或者創(chuàng)建之后創(chuàng)建,在組合對象銷毀之前銷毀,一般來說被組合對象不能脫離組合對象獨立存在,而且也只能屬于一個組合對象;聚合則不一樣,被聚合的對象可以屬于多個聚合對象。
再舉例子來說:你和你的朋友屬于關(guān)聯(lián)關(guān)系,因為你和你的朋友之間的關(guān)系是平等的,關(guān)聯(lián)關(guān)系只是表示一下兩個對象之間的一種簡單的聯(lián)系而已,就像我有一個朋友
你和你借的書屬于聚合關(guān)系,第一是因為書可以獨立存在,第二是因為書不僅僅屬于你,也可以屬于別人,只是暫時你擁有
你和你的心臟屬于組合關(guān)系,因為你的心臟只是屬于你的,不能脫離與你而存在
不過,實際應(yīng)用中,我個人感覺三種關(guān)系其實沒有區(qū)分得這么清楚,有些架構(gòu)師甚至?xí)f"組合和聚合沒什么區(qū)別",所以,有時候不需要把細節(jié)扣得這么細,合理利用對象之間的關(guān)系給出設(shè)計方案即可。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java uml聚合代码_UML类图(下):关联、聚合、组合、依赖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java连接stk外部接口_SLWSTK
- 下一篇: java 调用.net webservi