UML類圖(繼承、實現、關聯、依賴、組合、聚合),你還傻傻分不清嗎?

UML類圖


「左耳朵梵高」 總第11期


寫在最前面的話

聲明:本文部分資料摘自維基百科,還有我多年工作的積累和總結。本文很適合作爲一個工具,就當是一本UML說明書,請記得收藏哦,在需要用的時候方便查閱。

什麼是UML

維基百科對UML的定義:

UML(Unified Modeling Language)是一種開放的方法,用於說明、可視化、構建和編寫一個正在開發的、面向對象的、軟件密集系統的製品的開放方法。UML展現了一系列最佳工程實踐,這些最佳實踐在對大規模,複雜系統進行建模方面,特別是在軟件架構層次已經被驗證有效。

這個語言由葛來迪·布區,伊瓦爾·雅各布森與詹姆士·蘭寶於1994年至1995年間,在Rational Software公司中開發,於1996年,又進一步發展。UML集成了Booch,OMT和麪向對象程序設計的概念,將這些方法融合爲單一的,通用的,並且可以廣泛使用的建模語言。UML打算成爲可以對併發和分佈式系統的標準建模語言。

UML並不是一個工業標準,但在Object Management Group的主持和資助下,UML正在逐漸成爲工業標準。OMG之前曾經呼籲業界向其提供有關面向對象的理論及實現的方法,以便製作一個嚴謹的軟件建模語言(Software Modeling Language)。有很多業界的領袖亦真誠地迴應OMG,幫助它創建一個業界標準。

從維基百科的定義中,可以總結出幾個關鍵點:

  • UML是一個軟件建模語言。是一個事實上的工業標準;

  • UML用於提供面向對象設計的理論和實現方法;

  • UML提供了一系列最佳工程實踐,在系統建模、軟件架構設計層次十分有效。

進一步,我們可以總結出幾個關鍵字:軟件建模語言工業標準面向對象系統建模架構設計最佳時間

在UML系統開發中有三個主要的模型:

  • 功能模型 :從用戶的角度展示系統的功能,包括用例圖。

  • 對象模型 :採用對象,屬性,操作,關聯等概念展示系統的結構和基礎,包括類圖、對象圖。

  • 動態模型 :展現系統的內部行爲。包括序列圖,活動圖,狀態圖。

UML包含了一系列的圖,最常用的有用例圖、類圖、時序圖等。本文只會涉及類圖 ,其它的圖形將在以後的文章中進行介紹。

UML類圖詳解

類描述

在UML中通常以實線矩形框表示。矩形框中有若干分割線。分別表示類名、屬性和方法。如下圖所示:

  • 類名:圖中最上面的矩形框中爲類名。如果字體爲斜體 ,表示爲抽象類 。(圖中的上面部分)

  • 屬性:類名下邊的區域。(圖中的中間部分)

  • 方法:(圖中的下面部分)

說明:屬性和方法前面的“+”、“-”和“#”表示訪問級別:

  • +:public

  • -:private

  • #:protected

接口描述

接口 的類圖表述與類大致相同,不同的是接口名要添加 Interface 標識,且行爲的可見性必須用 "+" 表示。如下圖:

類和類之間的關係

類之間有六種關係:

  • 繼承

  • 實現

  • 關聯

  • 依賴

  • 組合

  • 聚合

繼承(Inherit)

繼承 是面嚮對象語言的三大特性(封裝,繼承,多態)之一。子類繼承父類。

UML類圖中繼承關係使用空心三角形+實線表示。

實現(Implement)

實現 與繼承類似,實現類繼承接口中的方法。

UML類圖中實現關係使用空心三角形+虛線表示。

關聯

依賴關係通常表現爲類的私有屬性。

// 企鵝類
public class Penguin {
  // 天氣類
  private Climate climate;
}

其UML類圖表示如下:

UML類圖中關聯使用實線箭頭表示。

依賴

依賴 關係體現爲局部變量、方法的形參,或者對靜態方法的調用。

public class Programmer {
  public void work(Computer computer){
    
  }
}

UML類圖中依賴關係使用虛線箭頭表示。

以下代碼展示了依賴關係的三種具體代碼實現:局部變量、方法的形參和對靜態方法的調用。

public class Person{
  public void doSomething1(){
    Car car = new Car();//局部變量
    ...
  }
  
  public void doSomething2(Car car){//方法參數
    ...
  }
  
  public void doSomething3(){
    int price = Car.do();//靜態方法調用
  }
}

組合

組合 是關聯關係的一種,表示一種強的“擁有”關係。體現了嚴格的部分和整體的關係。部分和整體的生命週期一樣。

public class Bird {
  private Wing wing;
  public Bird() {
    this.wing = new Wing();
  }
}

UML類圖中組合關係使用實心菱形+實線表示。

聚合

聚合 是關聯關係的一種,表示一種弱的“擁有”關係。

用Java代碼表示大雁是羣居動物,每隻大雁都屬於一個雁羣,一個雁羣可以有多隻大雁。

天氣涼了,樹葉黃了。
。。。
一羣大雁往南飛,一會排成“S”字,一會排成“B”字。
——《秋天》出自人教版小學語文一年級課文

public class WildGooseAggregate {
  private List<WildGoose> wideGooses;
}

UML類圖中聚合關係使用空心菱形實線表示。

All in One的例子

前面介紹了類之間的6種關係。爲了更好地理解這6種關係。下面使用一個完整的例子(汽車)。該示例中包含了這6種關係。

說明:

  • 車的類圖結構爲,表示車是一個抽象類;

  • 它有兩個繼承類:小汽車和自行車;它們之間的關係爲實現 關係,使用帶空心箭頭的虛線表示;

  • 小汽車爲與SUV之間也是繼承 關係,它們之間的關係爲泛化關係,使用帶空心箭頭的實線表示;

  • 小汽車與發動機之間是組合 關係,使用帶實心箭頭的實線表示;

  • 學生與班級之間是聚合 關係,使用帶空心箭頭的實線表示;

  • 學生與身份證之間爲關聯 關係,使用一根實線表示;

  • 學生上學需要用到自行車,與自行車是一種依賴 關係,使用帶箭頭的虛線表示;


每日一畫:鳶尾花

我是左耳朵梵高,北理工畢業,現任某金融諮詢公司首席架構師,曾在阿里巴巴中間件團隊任職。沉浸軟件行業十餘年,相信技術能改變世界。譯有《你真的會寫代碼嗎?》

堅持輸出技術乾貨,職場心得和讀書感悟。歡迎關注公衆號左耳朵梵高 ,和我一起持續學習,終生成長。


推薦閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章