重溫 UML 類圖

image

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): 實線+空箭頭

image


實現(xiàn)關(guān)系

實現(xiàn)關(guān)系 不用說了,就是實現(xiàn)接口

UML 圖標(biāo): 虛線+空箭頭

image

依賴關(guān)系

定義: 如果類中用到了對方,那么他們之間就存在依賴關(guān)系

舉例 1: A 中有個成員變量 B,那么就可以說 A 依賴了 B

舉例 2: Person 類依賴了 IDCard

class Person {
  IDCard _idCard;
}

class IDCard {
  String info;
}

UML 圖標(biāo): 虛線+短箭頭

image

特殊說明:

  1. 并不是只有成員變量才可以成為依賴,不管你在哪里用到的這個對象,都可以稱為依賴,包括以下情境,只要滿足下面的使用情境,就可以稱為:依賴
    • 類中用到了對方
    • 類的成員屬性
    • 方法的返回類型
    • 方法的參數(shù)類型
    • 方法中使用到
  1. 因為 關(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;
}
image

舉例 2: 多向一對一

class Person {
  IDCard _idCard;
}

class IDCard {
  Person _person;
  String info;
}
image

聚合關(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 {}
image

總結(jié)

  1. 雖然所有的類于屬性自之間的關(guān)系都可以用依賴表示,但是對于成員變量來說,我們更傾向于使用關(guān)聯(lián)、聚合、組合,剩下的可以用到依賴的時候就是方法傳參,返回值的情況居多了,所以大家注意

  2. 實線比虛線更能表示類之間的緊密關(guān)系 - 繼承用的實線,接口實線用的虛線,繼承的關(guān)系可比接口關(guān)系近多了。依賴是虛線,關(guān)聯(lián)是實現(xiàn),自然描述作為成員屬性的關(guān)聯(lián)自然比只剩下方法可以參數(shù)返回值可以描述的依賴要和類的關(guān)系更加緊密了

  3. 實心表示不可分割,空心表示可以分離 - 這點從聚合和組合就能看出來,除了組合之外,誰用實心的了


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容