UML 肯定有人不熟悉,很多人知道但是不會看、會看不會寫、會寫寫不熟練。這里我很肯定的告訴大家,UML 你用不好,用不熟練,那你就屬于:不入流 的那層次。不管你是拿來裝逼也好,還是真的設(shè)計復(fù)雜的功能、業(yè)務(wù)框架也好,UML 都是飛漲重要、起決定性的制約因素
我直說一點,你在公司里分享自己的功能、業(yè)務(wù)框架時,沒有沒 UML 那完全是2個概念,有的話既能裝逼得滿分,還能讓技術(shù)大神認(rèn)同你,上到領(lǐng)導(dǎo),下到同事都認(rèn)同你。效果就是這么明顯,所以大家 UML 走起吧
去年我專門寫過 UML 類圖的文章,但是時間久遠(yuǎn)都忘的差不多了,當(dāng)時純自己查資料學(xué)習(xí)的,看的囫圇吐棗,其中關(guān)系不是非常清楚。這幾天在B站上看到了:
尚硅谷 韓順平 圖解Java設(shè)計模式這個視頻教程,老師講的非常到位,以下就把 UML 類圖其中的6大關(guān)系講的非常清楚、透徹,很贊。其實吧完全不會的內(nèi)容,要是能找到大機(jī)構(gòu)或是N人的視頻講解,真的比純自學(xué)強(qiáng)太多了,自學(xué)很多時候很多認(rèn)識都是模糊?;蚴清e誤的。過寫年再回頭看,真想抽自己嘴巴,寫的都是什么玩意兒...設(shè)計模式視頻鏈接:尚硅谷 韓順平 圖解Java設(shè)計模式
古人云:B站是個學(xué)習(xí)網(wǎng)站,真是誠不欺我呀!一入B站深似海,從此游戲是路人...
UML 圖分類
UML 圖按照功能可以這么分:
用例圖 use case-
靜態(tài)結(jié)構(gòu)圖:類圖、對象圖、包圖、組件圖、部署圖 -
動態(tài)行為圖:交互圖(時序圖于協(xié)作圖)、狀態(tài)圖、活動圖
UML 所有的圖如下:
-
類圖(Class Diagram):描述系統(tǒng)所包含的類、類內(nèi)部結(jié)構(gòu)及類之間的關(guān)系。 -
對象圖(Object Diagram):是類圖的一個具體實例。 -
組件圖(Compoment Diagram):描述代碼部件的物理結(jié)構(gòu)以及各部件之間的依賴關(guān)系。 -
部署圖(Deployment Diagram):定義系統(tǒng)中軟、硬件的物理體系結(jié)構(gòu)。 -
用例圖(Usecase Diagram):從用戶的角度出發(fā)描述系統(tǒng)的功能、需求,展示系統(tǒng)外部的各類角色與系統(tǒng)內(nèi)部的* 各種用例之間的關(guān)系。 -
時序圖(Sequence Diagram):表示對象之間動態(tài)合作的關(guān)系。 -
協(xié)作圖(Collaboration Diagram):描述對象之間的協(xié)作關(guān)系。 -
狀態(tài)圖(Statechart Diagram):描述一類對象的所有可能的狀態(tài)及事件發(fā)生時狀態(tài)的轉(zhuǎn)移條件。 -
活動圖(Activity Diagram):描述系統(tǒng)中各種活動的執(zhí)行順序。
類圖是 UML 中最核心的圖
UML 類圖中類的6種關(guān)系
-
依賴、泛化(繼承)、實現(xiàn)、關(guān)聯(lián)、聚合、組合
看著很多啊,但是就起根本,只有3種關(guān)系:
類和屬性、參數(shù)之間的相互依賴類的繼承接口的實現(xiàn)
其他的關(guān)系大家可以這樣理解:
-
關(guān)聯(lián)是更復(fù)雜、更詳細(xì)表達(dá)的特殊依賴 -
聚合是使用 set 方式傳遞數(shù)據(jù)的特殊關(guān)聯(lián) -
組合是使用 new 方式產(chǎn)生數(shù)據(jù)的特殊關(guān)聯(lián)
ok,UML 中大家費解的類關(guān)系其實就是這么回事
泛化關(guān)系
泛化關(guān)系 就是 繼承關(guān)系,這點就不用說了
UML 圖標(biāo): 實線+空箭頭
實現(xiàn)關(guān)系
實現(xiàn)關(guān)系 不用說了,就是實現(xiàn)接口
UML 圖標(biāo): 虛線+空箭頭
依賴關(guān)系
定義: 如果類中用到了對方,那么他們之間就存在依賴關(guān)系
舉例 1: A 中有個成員變量 B,那么就可以說 A 依賴了 B
舉例 2: Person 類依賴了 IDCard
class Person {
IDCard _idCard;
}
class IDCard {
String info;
}
UML 圖標(biāo): 虛線+短箭頭
特殊說明:
- 并不是只有成員變量才可以成為依賴,不管你在哪里用到的這個對象,都可以稱為
依賴,包括以下情境,只要滿足下面的使用情境,就可以稱為:依賴類中用到了對方類的成員屬性方法的返回類型方法的參數(shù)類型方法中使用到
- 因為
關(guān)聯(lián)是依賴的更詳細(xì)說明,關(guān)聯(lián)是專門描述成員屬性的關(guān)系,所以依賴中所有涉及成員屬性的地方更適合使用:關(guān)聯(lián)、聚合、組合。因為大家看 UML 時看到依賴,那么肯定就可以排除成員屬性的情況,一般多是方法使用到對方
關(guān)聯(lián)關(guān)系
定義: 類于類之間的練習(xí),是依賴關(guān)系的特列
特性: 關(guān)聯(lián)關(guān)系是更具體的依賴關(guān)系,關(guān)聯(lián)關(guān)系只描述:成員變量,也就是類和其成員屬性之間的關(guān)系,可以是:單向一對一、雙向一對一。所以關(guān)聯(lián)關(guān)系的核心是:導(dǎo)航性,通過關(guān)聯(lián)關(guān)系我們只看 UML 就可以精確的了解類之間是怎么組織的了
UML 圖標(biāo):
-
單向:實線+短箭頭
image -
雙向:實線+沒有箭頭
image
舉例 1: 單向一對一
class Person {
IDCard _idCard;
}
class IDCard {
String info;
}
舉例 2: 多向一對一
class Person {
IDCard _idCard;
}
class IDCard {
Person _person;
String info;
}
聚合關(guān)系
定義: 整體和部分之間的關(guān)系
特性: 同樣只描述成員屬性、并且整體和部分是可以分開的,通常表現(xiàn)為那些通過 set 方法傳遞數(shù)值的成員變量,需要注意的是聚合關(guān)系是關(guān)聯(lián)關(guān)系的特例
UML 圖標(biāo):
-
單向:實線+空菱形
image
舉例: 電腦和鼠標(biāo)、顯示器就是典型的聚合關(guān)系,鼠標(biāo)和鍵盤都是熱插拔的,沒有鼠標(biāo)鍵盤不影響開機(jī),電腦一樣可以跑起來
class Computer {
Keyborad _keyborad;
Monitor _monitor;
set keyborad(Keyborad value) {
_keyborad = value;
}
set monitor(Monitor value) {
_monitor = value;
}
}
class Keyborad {}
class Monitor {}
組合關(guān)系
定義: 同樣也是整體和部分之間的關(guān)系
特性: 同樣只描述成員屬性、整體和部分是不可以分開的,通常表現(xiàn)為那些通過 new 創(chuàng)建出來的成員變量,需要注意的是組合關(guān)系也是關(guān)聯(lián)關(guān)系的特例。當(dāng)然組合還表現(xiàn)為整體若是銷毀了,組件也同樣必須銷毀
UML 圖標(biāo):
-
單向:實線+實心菱形
image
舉例: 電腦和機(jī)箱,機(jī)箱是電腦的核心所在,沒有機(jī)箱就沒有電腦一說,機(jī)箱是電腦永遠(yuǎn)不可或缺的部分,這就是典型的組合關(guān)系,
class Computer {
Keyborad _keyborad;
Monitor _monitor;
Chassis _chassis = Chassis();
set keyborad(Keyborad value) {
_keyborad = value;
}
set monitor(Monitor value) {
_monitor = value;
}
}
class Keyborad {}
class Monitor {}
class Chassis {}
總結(jié)
雖然所有的類于屬性自之間的關(guān)系都可以用依賴表示,但是對于成員變量來說,我們更傾向于使用關(guān)聯(lián)、聚合、組合,剩下的可以用到依賴的時候就是方法傳參,返回值的情況居多了,所以大家注意
實線比虛線更能表示類之間的緊密關(guān)系- 繼承用的實線,接口實線用的虛線,繼承的關(guān)系可比接口關(guān)系近多了。依賴是虛線,關(guān)聯(lián)是實現(xiàn),自然描述作為成員屬性的關(guān)聯(lián)自然比只剩下方法可以參數(shù)返回值可以描述的依賴要和類的關(guān)系更加緊密了實心表示不可分割,空心表示可以分離- 這點從聚合和組合就能看出來,除了組合之外,誰用實心的了