UML類圖用來定義系統(tǒng)中的類,包括描述類的結(jié)構(gòu)和類之間的關(guān)系燥翅。類圖的主要作用于描述系統(tǒng)的靜態(tài)結(jié)構(gòu)骑篙。
先看一張圖(圖片截取自AmaterasUML):
實體
類
組成
一般包含3個組成部分:類名、屬性森书、方法
類的性質(zhì)可以放在第四部分
如果類中含有內(nèi)部類靶端,則會出現(xiàn)下一個組成部分
類名部分是不能省略的,其他組成部分可以省略
書寫規(guī)范
類名:正體字說明類是可被實例化的凛膏,斜體字說明類為抽象類杨名。
屬性:<修飾符> <<描述信息>> <屬性名>: <類型>
方法:<修飾符> <<描述信息>> <方法名> (<參數(shù):類型 ...>): <返回類型>
修飾符:
+
表示public;-
表示private猖毫;#
表示protected台谍;省略
表示包可見性。
如果屬性/方法具有下劃線吁断,則說明它是靜態(tài)的趁蕊。
描述信息使用<< >>
包裹。
類的性質(zhì)是由一個屬性仔役、一個賦值方法和一個取值方法組成掷伙。
栗子
public class TaxCalculator {
private long taxRate ;
private int salary;
public TaxCalculator(long taxRate) {
this.taxRate = taxRate ;
}
public long countTax() {
return taxRate * salary;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
接口
接口是一系列操作的集合,它指定了提供的一系列服務(wù)又兵。它直接對應(yīng)于Java中的一個接口類型任柜。接口的表示有大概兩種方式。具體畫法如下:
public interface TaxCalculator
{
public long countTax();
public int getSalary();
public void setSalary(int salary);
}
當然也有這樣的畫法:
關(guān)系
依賴(Dependency)
依賴是一種弱關(guān)聯(lián)沛厨,只要一個類用到另一個類宙地,但是和另一個類的關(guān)系不是太明顯的時候,就可以使用依賴關(guān)系
【依賴關(guān)系】:是一種使用的關(guān)系逆皮,即一個類的實現(xiàn)需要另一個類的協(xié)助宅粥,所以要盡量不使用雙向的互相依賴
【代碼表現(xiàn)】:局部變量、方法的參數(shù)或者對靜態(tài)方法的調(diào)用
【箭頭及指向】:帶箭頭的虛線页屠,指向被使用者
關(guān)聯(lián)(Association)
表示類與類之間的連接粹胯。它使一個類的可見屬性和方法被另一個類使用。是兩個類辰企、或者類與接口之間語義級別的一種強依賴關(guān)系风纠,不存在依賴關(guān)系的偶然性、臨時性牢贸。一般是長期性的竹观,而且雙方的關(guān)系一般是平等的
【關(guān)聯(lián)關(guān)系】:是一種擁有的關(guān)系,它使一個類知道另一個類的屬性和方法;關(guān)聯(lián)可以是雙向的臭增,也可以是單向的懂酱。雙向的關(guān)聯(lián)的箭頭是可選的,單向的箭頭指向遍歷或者查詢的方向誊抛。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶普通箭頭的實心線列牺,指向被擁有者
在關(guān)聯(lián)關(guān)系中可以使用附加的基數(shù)來說明類之間對應(yīng)的個數(shù):
基數(shù) | 含義 |
---|---|
0..1 | 零個或者一個實例 |
0..* | 沒有限制,任意 |
* | 沒有限制拗窃,任意 |
1 | 有且只能一個實例 |
1..* | 至少有一個實例 |
注意:一個關(guān)聯(lián)關(guān)系往往是聚合關(guān)系或者是合成關(guān)系瞎领。
泛化(Generalization)
表示類與類、接口與接口之間的繼承關(guān)系随夸。
【泛化關(guān)系】:是一種繼承關(guān)系九默,表示一般與特殊的關(guān)系,它指定了子類如何特化父類的所有特征和行為宾毒。
【代碼體現(xiàn)】:父類與子類(extends)
【箭頭指向】:帶三角箭頭的實線驼修,箭頭指向父類
實現(xiàn)(Realization)
實現(xiàn)關(guān)系指定兩個實體之間的一個合同。換言之诈铛,一個實體定義一個合同乙各,而另一個實體保證履行該合同。
【實現(xiàn)關(guān)系】:是一種類與接口的關(guān)系癌瘾,表示類是接口所有特征和行為的實現(xiàn)
【代碼體現(xiàn)】:接口與實現(xiàn)類(implements)
【箭頭指向】:帶三角箭頭的虛線觅丰,箭頭指向接口
聚合(Aggregation)
聚合是關(guān)聯(lián)的一種形式饵溅,代表兩個類之間的整體/局部關(guān)系妨退,他體現(xiàn)的是一種has-a的關(guān)系。聚合暗示著整體在概念上處于比局部更高的一個級別蜕企,而關(guān)聯(lián)暗示兩個類在概念上位于相同的級別咬荷。聚合還暗示著實例圖中不存在回路,換言之轻掩,只能是一種單向關(guān)系幸乒。
【聚合關(guān)系】:整體與部分的關(guān)系,且部分可以離開整體而單獨存在唇牧,可以具有各自的生命周期罕扎。關(guān)聯(lián)和聚合的區(qū)別純粹是概念上的,在Java語法上無法分辨丐重。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶空心菱形的實心線腔召,菱形指向整體
組合(Composite)
組合也是關(guān)聯(lián)關(guān)系的一種特例,他體現(xiàn)的是一種contains-a的關(guān)系扮惦,這種關(guān)系比聚合更強臀蛛,也稱為強聚合;他同樣體現(xiàn)整體與部分間的關(guān)系,但此時整體與部分是不可分的浊仆,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束客峭;比如你和你的大腦。組合關(guān)系是不能共享的抡柿。
【組合關(guān)系】:是整體與部分的關(guān)系舔琅,但部分不能離開整體而單獨存在。它要求普通的聚合關(guān)系中代表整體的對象負責代表部分的對象的生命周期洲劣。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶實心菱形的實線搏明,菱形指向整體
總結(jié)
關(guān)系總結(jié)
泛化:表示類與類之間的繼承關(guān)系、接口與接口之間的繼承關(guān)系闪檬;
實現(xiàn):表示類對接口的實現(xiàn)星著;
依賴:當類與類之間有使用關(guān)系時就屬于依賴關(guān)系,不同于關(guān)聯(lián)關(guān)系粗悯,依賴不具有“擁有關(guān)系”虚循,而是一種“相識關(guān)系”,只在某個特定地方(比如某個方法體內(nèi))才有關(guān)系样傍。
關(guān)聯(lián):表示類與類或類與接口之間的依賴關(guān)系横缔,表現(xiàn)為“擁有關(guān)系”;具體到代碼可以用實例變量來表示衫哥;
聚合:屬于關(guān)聯(lián)的特殊情況茎刚,體現(xiàn)部分-整體關(guān)系,是一種弱擁有關(guān)系撤逢;整體和部分可以有不一樣的生命周期膛锭;
組合:屬于關(guān)聯(lián)的特殊情況,體現(xiàn)部分-整體關(guān)系蚊荣,是一種強“擁有關(guān)系”初狰。
關(guān)系強弱
泛化=實現(xiàn)>組合>聚合>關(guān)聯(lián)>依賴
畫法
繼承、實現(xiàn)是三角型箭頭互例,其他都為箭頭
組合奢入、聚合都有一個菱形端,且都為實線媳叨,其他都無菱形端
繼承是實線腥光,實現(xiàn)是虛線;關(guān)聯(lián)是實線糊秆,依賴是虛線
箭頭:指向父類或接口武福、依賴物、子元素扩然。
看個經(jīng)典例子
說明:
實現(xiàn):空心圓+直線(唐老鴨類實現(xiàn)了‘講人話’)艘儒;
實現(xiàn):空心三角形+虛線(實現(xiàn)大雁飛翔的接口);
依賴:虛線+箭頭(動物和空氣的關(guān)系);
關(guān)聯(lián):實線+箭頭(企鵝需要知道氣候才遷移)界睁;
聚合:空心四邊形+實線+箭頭(雁群和大雁的關(guān)系)觉增;
合成/組合:實心四邊形+實線+箭頭(鳥和翅膀的關(guān)系);
泛化/繼承:空心三角形+實線(動物和鳥的繼承關(guān)系)翻斟。
想要具體剖析本圖逾礁,請查看這里。PS:文中圖片來自于網(wǎng)絡(luò)访惜,侵刪嘹履。