通常我們都會(huì)使用UML圖來(lái)表示類與類之間的關(guān)系鹉动。在這里介紹基本的UML畫法廊宪,并用UML圖類表示類之間的關(guān)系煎娇。
UML類圖的表示方式:
一、類的屬性的表示方式
在UML類圖中丹鸿,類使用包含類名越走、屬性(field) 和方法(method) 且?guī)в蟹指罹€的矩形來(lái)表示,比如下圖表示一個(gè)Employee類靠欢,它包含name,age和email這3個(gè)屬性廊敌,以及modifyInfo()方法。
那么屬性/方法名稱前加的加號(hào)和減號(hào)是什么意思呢门怪?它們表示了這個(gè)屬性或方法的可見(jiàn)性骡澈,UML類圖中表示可見(jiàn)性的符號(hào)有三種:
+ :表示
public
- :表示private
#:表示protected
(friendly也歸入這類)
因此,上圖中的Employee類具有3個(gè)私有屬性和一個(gè)公有方法掷空。
實(shí)際上肋殴,屬性的完整表示方式是這樣的:
可見(jiàn)性 名稱 :類型 [ = 缺省值]
中括號(hào)中的內(nèi)容表示是可選的
二、類的方法的表示方式
上圖中我們已經(jīng)看到了方法的表示形式坦弟。實(shí)際上护锤,方法的完整表示方式如下:
可見(jiàn)性 名稱(參數(shù)列表) [ : 返回類型]
同樣,中括號(hào)中的內(nèi)容是可選的酿傍。
比如在下圖的Demo類中烙懦,定義了3個(gè)方法:
-
public
方法method1接收一個(gè)類型為Object的參數(shù),返回值類型為void -
protected
方法method2無(wú)參數(shù)拧粪,返回值類型為String -
private
方法method3接收類型分別為int修陡、int[]的參數(shù)沧侥,返回值類型為int
類之間大體分為5種關(guān)系:
在設(shè)計(jì)模式中類與類之間的關(guān)系主要有5種:依賴、關(guān)聯(lián)魄鸦、聚合宴杀、組合、繼承拾因,它們之間的耦合度依次增加旺罢。
1,依賴關(guān)系(Dependency)
單向绢记,表示一個(gè)類依賴于另一個(gè)類的定義扁达,其中一個(gè)類的變化將影響另外一個(gè)類,是一種“use a”關(guān)系!如果A依賴于B蠢熄,則B表現(xiàn)為A的局部變量跪解,方法參數(shù),靜態(tài)方法調(diào)用等
public class Driver {
public void driver(){
Car car = new Car ();//局部變量
....
}
public void driver1(Car car){} //方法參數(shù)
public void driver2(){
Car.move(); //靜態(tài)方法調(diào)用
...
}
}
正常情況下叉讥,如果先設(shè)計(jì)類圖, 再進(jìn)行編碼饥追,那么在類圖的設(shè)計(jì)過(guò)程中是不會(huì)涉及到具體的實(shí)現(xiàn)細(xì)節(jié)的图仓,所以畫類圖的依賴關(guān)系時(shí),只要關(guān)注接口層面就可以了(依賴僅畫接口參數(shù)但绕,忽略局部變量救崔,靜態(tài)方法調(diào)用)
2,關(guān)聯(lián)關(guān)系(Association)
單向或雙向(通常我們需要避免使用雙向關(guān)聯(lián)關(guān)系)捏顺,是一種"has a"關(guān)系六孵,如果A單向關(guān)聯(lián)B,則可以說(shuō)A has a B草丧,通常表現(xiàn)為全局變量
public class Customer {
public Address address;
public void setAddress (Address address){
this.address= address;
}
public Address getAddress (){
return address;
}
}
雙向關(guān)聯(lián):
自關(guān)聯(lián):
3,聚合關(guān)系(Aggregation)
單向昌执,關(guān)聯(lián)關(guān)系的一種,與關(guān)聯(lián)關(guān)系之間的區(qū)別是語(yǔ)義上的诈泼,關(guān)聯(lián)的兩個(gè)對(duì)象通常是平等的懂拾,聚合則一般不平等,有一種整體和局部的感覺(jué)铐达,實(shí)現(xiàn)上區(qū)別不大!
public class Team {
public Person person;
public Team(Person person){
this.person = person;
}
}
Team 由 Person 組成岖赋,其生命周期不同,整體不存在了瓮孙,部分依然存在唐断,當(dāng)前Team解散了选脊,人還在,還可以加入別的組脸甘。
4恳啥,組合關(guān)系(Composition)
單向,是一種強(qiáng)依賴的特殊聚合關(guān)系
public class Person {
public Head head;
public Body body;
public Person(){
head = new Head();
body = new Body();
}
}
Head钝的,Body,Arm和Leg等組合成People铆遭,其生命周期相同硝桩,如果整體不存在了,部分也將消亡枚荣。
5碗脊,繼承關(guān)系(Inheritance)
類繼承抽象類,類繼承父類橄妆,對(duì)應(yīng)的是extend關(guān)鍵字
類實(shí)現(xiàn)接口衙伶,對(duì)應(yīng)implement關(guān)鍵字
可以分得更細(xì):
實(shí)現(xiàn)(Realization):類實(shí)現(xiàn)接口屬于這種關(guān)系
泛化(Generalization):即"is a"關(guān)系,類繼承抽象類呼畸,類繼承父類都屬于這種關(guān)系