Java利器之UML類圖詳解

前言

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

最近看一些開源項目的時候,總是看到UML中的類圖,一開始自己的做法就是跳過去類圖的部分,不過後來又遇到了幾次,就決定學習下,不能再選擇逃避了,這也是一個即將優秀的程序探索者應該必備的素質。今天把自己學習到的內容記錄一下(怕健忘…),相信對類圖不清楚的朋友,通過讀取這篇文章後也能有一個比較清晰的認識,讓你看的懂,畫的出。

類圖作用

類圖是軟件工程的統一建模語言一種靜態結構圖,該圖描述了系統的類集合,類的屬性和類之間的關係。幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。學習好類圖的繪製,是一位合格的軟件工程師應有的技能。

類的UML圖示

在UML類圖中,類使用包含類名,屬性,方法名及其參數並且用分割線分隔的長方形表示。例如最簡單的一個類Person 類有兩個屬性分別是name和age,並提供對應的get和set方法。java類代碼如下

/***********************************************************************
 * Module:  Person.java
 * Author:  Code4Android
 * Purpose: Defines the Class Person
 ***********************************************************************/

import java.util.*;

/** @pdOid 4615fa10-38a3-446e-a7d5-59dcb3e786b5 */
public class Person {
   /** @pdOid f314a698-c3c1-4ec7-a8ea-f8b2df107a29 */
   private String name = zhangsan;
   /** @pdOid 271c633b-87e5-4b41-9f70-2ce320635014 */
   private int age = 23;

   /** @pdOid ccf5b7c1-d005-4a5f-b823-9988f2dd6f91 */
   public String getName() {
      // TODO: implement
      return name;
   }

   /** @pdOid 83e01fba-b004-498e-b7ab-778de8be6dfa */
   public int getAge() {
      // TODO: implement
      return age;
   }

   /** @param name
    * @pdOid 9525895a-11bf-44a3-afed-b4a014540a98 */
   public void setName(String name) {
      // TODO: implement
      this.name=name;
   }

   /** @param age
    * @pdOid 16fd66cc-2af1-4fef-ae98-2a37f495a487 */
   public void setAge(int age) {
      // TODO: implement
      this.age=age;
   }

}

那麼用類圖表示如下,它很簡單的表示出了類的所有信息。

這裏寫圖片描述

通過上面的Person的類圖,你應該可以看出類圖有三部分組成,類名,屬性和操作方法

類名

顧名思義就是類的名字,對應於Java類中的類名,如果該類是抽象類的話,在類名右下角會有一個(Abstract)表示,假如Person是一個抽象類的話,則UML類圖如下

這裏寫圖片描述

屬性名

UML中的屬性名就是Java中的成員變量,當然一個類可以沒有屬性也可以有任意多個屬性。Java類中成員變量的修飾符,類型和默認值都可以在UML類圖中體現出來。通用表示方法如下

可見性  名稱:類型 [ = 默認值 ]

在Java類中可見性分爲三類,分別是private,public 和protected,在類圖中分別用符號-、+和#表示。通用表示方法中名稱就成員變量的名字,類型就是成員變量的類型如String類型,int類型等,當然也可以是自定義類型。而後面的默認值是可選參數,如果我們沒有給成員變量設置初始值,UML類圖中就不顯示,如上面Person類圖,變量name,age沒有設置初始值,如果此時我們給name和vaule分別設置默認值zhangsan,23。則UML類圖如下

這裏寫圖片描述

操作方法

可見性  名稱(參數列表) [ : 返回類型]

類的操作方法通用表示方式如上,方法可見性和屬性可見性是一致的,名稱就是方法名,參數列表是可選像,可以是對個參數也是沒有參數,若多個參數用英文逗號隔開,返回類型是一個可選項,表示方法的返回值類型,依賴於具體的編程語言,可以是基本數據類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構造方法,則無返回類型。

類之間的關係

在UML類圖中類與類之間存在多種關係,如泛化(Generalization)關係,實現(Realization)關係,依賴(Dependence)關係,關聯(Association)關係,聚合(Aggregation)關係, 組合(Composition)關係。

泛化(Generalization)關係

泛化關係也就是Java中的繼承,類和類,接口和接口都可以是繼承關係,父類又稱作基類或超類,子類又稱作派生類,類繼承父類後可以實現父類的所以功能,並能擁有父類沒有的功能。在UML中,泛化關係可以用帶空心三角形的直線來表示;例如我們創建兩個Java類Teachers和Students類如下代碼

/***********************************************************************
 * Module:  Teachers.java
 * Author:  Code4Android
 * Purpose: Defines the Class Teachers
 ***********************************************************************/

import java.util.*;

/** @pdOid b54e2d34-d17e-4f2d-993d-563b8e007db4 */
public class Teachers extends Person {
   /** @pdOid 55b38630-1e30-449b-9cb7-f8ef9de59412 */
   private int tNumber;

   /** @pdOid f603d47d-a51f-4b0c-b10b-881842374f8a */
   public String teach() {
      // TODO: implement
      return "I am teaching";
   }

}


/***********************************************************************
 * Module:  Students.java
 * Author:  Code4Android
 * Purpose: Defines the Class Students
 ***********************************************************************/

import java.util.*;

/** @pdOid 6b8ac239-000e-46d3-8233-962a612c12bd */
public class Students extends Person {
   /** @pdOid 0c7627fd-fa78-4f60-a859-2b90274323e1 */
   private int sNumber;

   /** @pdOid 1f929347-b84a-4a54-9ca9-144de66c742b */
   public String study() {
      // TODO: implement
      return "I am learning";
   }

}

則UML類圖如下

這裏寫圖片描述

實現(Realization)關係

實現關係在java中就是一個類和接口之間的關係,接口中一般是沒有成員變量,所有操作都是抽象的(abstract修飾),只有聲明沒有具體的實現,具體實現需在實現該接口的類中。在UML中用與類的表示法類似的方式表示接口,區別可在UML中類圖中看出。如我們創建一個交通工具類接口IVehicle,並有一個形式速度方法聲明travelSpeed,Java代碼如下

/***********************************************************************
 * Module:  IVehicle.java
 * Author:  Code4Android
 * Purpose: Defines the Interface IVehicle
 ***********************************************************************/

import java.util.*;

/** @pdOid 7cbe9f91-a7d9-44b5-a743-280cbc464e61 */
public interface IVehicle {
   /** @pdOid 5e87ebbc-5647-4dc6-8c3c-d23857662584 */
   int travelSpeed();

}

對於交通工具,有很多種,不同交通工具都有一個速度,我們舉兩個例子,如HighSpeedRail(高鐵,時速288KM)和Bicycle(自行車類時速20KM),則兩個實現類代碼爲

/***********************************************************************
 * Module:  HighSpeedRail.java
 * Author:  Code4Android
 * Purpose: Defines the Class HighSpeedRail
 ***********************************************************************/

import java.util.*;

/** @pdOid 0ae31b48-07b0-4bcd-83ff-a8a7c7d94518 */
public class HighSpeedRail implements IVehicle {
   /** @pdOid a7693fd4-d6d4-4e93-a946-380f69011b13 */
   public int travelSpeed() {
      // TODO: implement
      return 288;
   }

}

/***********************************************************************
 * Module:  Bicycle.java
 * Author:  Code4Android
 * Purpose: Defines the Class Bicycle
 ***********************************************************************/

import java.util.*;

/** @pdOid c212a8c3-88db-48d8-a2a0-d381d2ee7f91 */
public class Bicycle implements IVehicle {
   /** @pdOid 9ac52769-7489-47b0-9079-4f63f84f1fde */
   public int travelSpeed() {
      // TODO: implement
      return 20;
   }

}

在UML中實現接口用虛線和帶空心的三角形表示。則上面對應的UML類圖如下

這裏寫圖片描述

依賴(Dependence)關係

依賴關係是類與類之間最弱的關係,依賴可以簡單的理解一個類使用了另一個類,這種使用關係具有臨時性特徵,但是一個類又會由於另一個類的改變而受到影響,例如在上面舉的例子中,假如我們的Students類擁有一個Bicycle,那麼要獲取移動速度則需要使用Bicycle中獲取速度的方法travelSpeed()方法。此時Students代碼如下

/***********************************************************************
 * Module:  Students.java
 * Author:  Code4Android
 * Purpose: Defines the Class Students
 ***********************************************************************/

import java.util.*;

/** @pdOid 6b8ac239-000e-46d3-8233-962a612c12bd */
public class Students extends Person {
   /** @pdOid 0c7627fd-fa78-4f60-a859-2b90274323e1 */
   private int sNumber;

   /** @pdOid 1f929347-b84a-4a54-9ca9-144de66c742b */
   public String study() {
      return "I am learning";
   }

   /** @param bicycle
    * @pdOid 82bd76ff-f70c-4e25-bea5-8de19db4699c */
   public int moveSpeed(Bicycle bicycle) {
      return bicycle.travelSpeed();
   }

}

在UML中一欄用帶箭頭的虛線表示依賴,對應的UML類圖如下

這裏寫圖片描述

關聯(Association)關係

關聯關係表示一個類和另一類有聯繫,例如在上面的舉例中每個Teachers都有個家庭住址與之對應,而此時Teacher和Address就形成了一對一的關聯關係。如下

這裏寫圖片描述

關聯關係是一種包含關係,在UML中用一個帶箭頭的實線表示,箭頭指向被包含類。在上圖中你可能會發現在線上有1 ..1,這個是說明包含關係的。在UML類中有如下幾種。

1..1 表示另一個類的一個對象只與該類的一個對象有關係

0..* 表示另一個類的一個對象與該類的零個或多個對象有關係

1..* 表示另一個類的一個對象與該類的一個或多個對象有關係

0..1 表示另一個類的一個對象沒有或只與該類的一個對象有關係

* 任意多個對象關聯

聚合(Aggregation)關係

聚合關係是表示整體與部分的關係,但是部分可以脫離整體而存在。例如一個Teachers對象有一輛汽車Car,此時Car就是Teachers的一部分,但是Car可以脫離Teachers而存在。在UML類中聚合關係用帶空心菱形的直線表示。
這裏寫圖片描述

組合(Composition)關係

組合關係也是一種部分和整體的關係,但是部分存活週期受到整體的影響,若整體不存在則部分也將不存在。此時部分需在整體的構造方法中創建。在UML類中,組合關係用帶實心菱形的直線表示。

這裏寫圖片描述

在文章的最後,附上本篇文章所畫的完整的UML類圖。

這裏寫圖片描述

到此,本篇文章真的結束了,若文章有不足或者錯誤的地方,歡迎指正,以防止給其他讀者錯誤引導。最後感謝LoveLion的系列文章。

發佈了47 篇原創文章 · 獲贊 42 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章