Java利器之UML類(lèi)圖詳解

前言

UML(Unified Modeling Language)中文統(tǒng)一建模語(yǔ)言,是一種開(kāi)放的方法,用于說(shuō)明、可視化、構(gòu)建和編寫(xiě)一個(gè)正在開(kāi)發(fā)的、面向?qū)ο蟮?、軟件密集系統(tǒng)的制品的開(kāi)放方法。UML展現(xiàn)了一系列最佳工程實(shí)踐,這些最佳實(shí)踐在對(duì)大規(guī)模,復(fù)雜系統(tǒng)進(jìn)行建模方面,特別是在軟件架構(gòu)層次已經(jīng)被驗(yàn)證有效。 【維基百科】

最近看一些開(kāi)源項(xiàng)目的時(shí)候,總是看到UML中的類(lèi)圖,一開(kāi)始自己的做法就是跳過(guò)去類(lèi)圖的部分,不過(guò)后來(lái)又遇到了幾次,就決定學(xué)習(xí)下,不能再選擇逃避了,這也是一個(gè)即將優(yōu)秀的程序探索者應(yīng)該必備的素質(zhì)。今天把自己學(xué)習(xí)到的內(nèi)容記錄一下(怕健忘...),相信對(duì)類(lèi)圖不清楚的朋友,通過(guò)讀取這篇文章后也能有一個(gè)比較清晰的認(rèn)識(shí),讓你看的懂,畫(huà)的出。

類(lèi)圖作用

類(lèi)圖是軟件工程的統(tǒng)一建模語(yǔ)言一種靜態(tài)結(jié)構(gòu)圖,該圖描述了系統(tǒng)的類(lèi)集合,類(lèi)的屬性和類(lèi)之間的關(guān)系。幫助人們簡(jiǎn)化對(duì)系統(tǒng)的理解,它是系統(tǒng)分析和設(shè)計(jì)階段的重要產(chǎn)物,也是系統(tǒng)編碼和測(cè)試的重要模型依據(jù)。學(xué)習(xí)好類(lèi)圖的繪制,是一位合格的軟件工程師應(yīng)有的技能。

類(lèi)的UML圖示

在UML類(lèi)圖中,類(lèi)使用包含類(lèi)名,屬性,方法名及其參數(shù)并且用分割線(xiàn)分隔的長(zhǎng)方形表示。例如最簡(jiǎn)單的一個(gè)類(lèi)Person 類(lèi)有兩個(gè)屬性分別是name和age,并提供對(duì)應(yīng)的get和set方法。java類(lèi)代碼如下

/***********************************************************************
 * 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;
   }

}

那么用類(lèi)圖表示如下,它很簡(jiǎn)單的表示出了類(lèi)的所有信息。

這里寫(xiě)圖片描述

通過(guò)上面的Person的類(lèi)圖,你應(yīng)該可以看出類(lèi)圖有三部分組成,類(lèi)名,屬性和操作方法

類(lèi)名

顧名思義就是類(lèi)的名字,對(duì)應(yīng)于Java類(lèi)中的類(lèi)名,如果該類(lèi)是抽象類(lèi)的話(huà),在類(lèi)名右下角會(huì)有一個(gè)(Abstract)表示,假如Person是一個(gè)抽象類(lèi)的話(huà),則UML類(lèi)圖如下

這里寫(xiě)圖片描述

屬性名

UML中的屬性名就是Java中的成員變量,當(dāng)然一個(gè)類(lèi)可以沒(méi)有屬性也可以有任意多個(gè)屬性。Java類(lèi)中成員變量的修飾符,類(lèi)型和默認(rèn)值都可以在UML類(lèi)圖中體現(xiàn)出來(lái)。通用表示方法如下

可見(jiàn)性  名稱(chēng):類(lèi)型 [ = 默認(rèn)值 ]

在Java類(lèi)中可見(jiàn)性分為三類(lèi),分別是private,public 和protected,在類(lèi)圖中分別用符號(hào)-、+和#表示。通用表示方法中名稱(chēng)就成員變量的名字,類(lèi)型就是成員變量的類(lèi)型如String類(lèi)型,int類(lèi)型等,當(dāng)然也可以是自定義類(lèi)型。而后面的默認(rèn)值是可選參數(shù),如果我們沒(méi)有給成員變量設(shè)置初始值,UML類(lèi)圖中就不顯示,如上面Person類(lèi)圖,變量name,age沒(méi)有設(shè)置初始值,如果此時(shí)我們給name和vaule分別設(shè)置默認(rèn)值z(mì)hangsan,23。則UML類(lèi)圖如下

這里寫(xiě)圖片描述

操作方法

可見(jiàn)性  名稱(chēng)(參數(shù)列表) [ : 返回類(lèi)型]

類(lèi)的操作方法通用表示方式如上,方法可見(jiàn)性和屬性可見(jiàn)性是一致的,名稱(chēng)就是方法名,參數(shù)列表是可選像,可以是對(duì)個(gè)參數(shù)也是沒(méi)有參數(shù),若多個(gè)參數(shù)用英文逗號(hào)隔開(kāi),返回類(lèi)型是一個(gè)可選項(xiàng),表示方法的返回值類(lèi)型,依賴(lài)于具體的編程語(yǔ)言,可以是基本數(shù)據(jù)類(lèi)型,也可以是用戶(hù)自定義類(lèi)型,還可以是空類(lèi)型(void),如果是構(gòu)造方法,則無(wú)返回類(lèi)型。

類(lèi)之間的關(guān)系

在UML類(lèi)圖中類(lèi)與類(lèi)之間存在多種關(guān)系,如泛化(Generalization)關(guān)系,實(shí)現(xiàn)(Realization)關(guān)系,依賴(lài)(Dependence)關(guān)系,關(guān)聯(lián)(Association)關(guān)系,聚合(Aggregation)關(guān)系, 組合(Composition)關(guān)系。

泛化(Generalization)關(guān)系

泛化關(guān)系也就是Java中的繼承,類(lèi)和類(lèi),接口和接口都可以是繼承關(guān)系,父類(lèi)又稱(chēng)作基類(lèi)或超類(lèi),子類(lèi)又稱(chēng)作派生類(lèi),類(lèi)繼承父類(lèi)后可以實(shí)現(xiàn)父類(lèi)的所以功能,并能擁有父類(lèi)沒(méi)有的功能。在UML中,泛化關(guān)系可以用帶空心三角形的直線(xiàn)來(lái)表示;例如我們創(chuàng)建兩個(gè)Java類(lèi)Teachers和Students類(lèi)如下代碼

/***********************************************************************
 * 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類(lèi)圖如下

這里寫(xiě)圖片描述

實(shí)現(xiàn)(Realization)關(guān)系

實(shí)現(xiàn)關(guān)系在java中就是一個(gè)類(lèi)和接口之間的關(guān)系,接口中一般是沒(méi)有成員變量,所有操作都是抽象的(abstract修飾),只有聲明沒(méi)有具體的實(shí)現(xiàn),具體實(shí)現(xiàn)需在實(shí)現(xiàn)該接口的類(lèi)中。在UML中用與類(lèi)的表示法類(lèi)似的方式表示接口,區(qū)別可在UML中類(lèi)圖中看出。如我們創(chuàng)建一個(gè)交通工具類(lèi)接口IVehicle,并有一個(gè)形式速度方法聲明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();

}

對(duì)于交通工具,有很多種,不同交通工具都有一個(gè)速度,我們舉兩個(gè)例子,如HighSpeedRail(高鐵,時(shí)速288KM)和Bicycle(自行車(chē)類(lèi)時(shí)速20KM),則兩個(gè)實(shí)現(xiàn)類(lèi)代碼為

/***********************************************************************
 * 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中實(shí)現(xiàn)接口用虛線(xiàn)和帶空心的三角形表示。則上面對(duì)應(yīng)的UML類(lèi)圖如下

這里寫(xiě)圖片描述

依賴(lài)(Dependence)關(guān)系

依賴(lài)關(guān)系是類(lèi)與類(lèi)之間最弱的關(guān)系,依賴(lài)可以簡(jiǎn)單的理解一個(gè)類(lèi)使用了另一個(gè)類(lèi),這種使用關(guān)系具有臨時(shí)性特征,但是一個(gè)類(lèi)又會(huì)由于另一個(gè)類(lèi)的改變而受到影響,例如在上面舉的例子中,假如我們的Students類(lèi)擁有一個(gè)Bicycle,那么要獲取移動(dòng)速度則需要使用Bicycle中獲取速度的方法travelSpeed()方法。此時(shí)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中一欄用帶箭頭的虛線(xiàn)表示依賴(lài),對(duì)應(yīng)的UML類(lèi)圖如下

這里寫(xiě)圖片描述

關(guān)聯(lián)(Association)關(guān)系

關(guān)聯(lián)關(guān)系表示一個(gè)類(lèi)和另一類(lèi)有聯(lián)系,例如在上面的舉例中每個(gè)Teachers都有個(gè)家庭住址與之對(duì)應(yīng),而此時(shí)Teacher和Address就形成了一對(duì)一的關(guān)聯(lián)關(guān)系。如下

這里寫(xiě)圖片描述

關(guān)聯(lián)關(guān)系是一種包含關(guān)系,在UML中用一個(gè)帶箭頭的實(shí)線(xiàn)表示,箭頭指向被包含類(lèi)。在上圖中你可能會(huì)發(fā)現(xiàn)在線(xiàn)上有1 ..1,這個(gè)是說(shuō)明包含關(guān)系的。在UML類(lèi)中有如下幾種。

1..1 表示另一個(gè)類(lèi)的一個(gè)對(duì)象只與該類(lèi)的一個(gè)對(duì)象有關(guān)系

0..* 表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)的零個(gè)或多個(gè)對(duì)象有關(guān)系

1..* 表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)的一個(gè)或多個(gè)對(duì)象有關(guān)系

0..1 表示另一個(gè)類(lèi)的一個(gè)對(duì)象沒(méi)有或只與該類(lèi)的一個(gè)對(duì)象有關(guān)系

* 任意多個(gè)對(duì)象關(guān)聯(lián)

聚合(Aggregation)關(guān)系

聚合關(guān)系是表示整體與部分的關(guān)系,但是部分可以脫離整體而存在。例如一個(gè)Teachers對(duì)象有一輛汽車(chē)Car,此時(shí)Car就是Teachers的一部分,但是Car可以脫離Teachers而存在。在UML類(lèi)中聚合關(guān)系用帶空心菱形的直線(xiàn)表示。


這里寫(xiě)圖片描述

組合(Composition)關(guān)系

組合關(guān)系也是一種部分和整體的關(guān)系,但是部分存活周期受到整體的影響,若整體不存在則部分也將不存在。此時(shí)部分需在整體的構(gòu)造方法中創(chuàng)建。在UML類(lèi)中,組合關(guān)系用帶實(shí)心菱形的直線(xiàn)表示。

這里寫(xiě)圖片描述

在文章的最后,附上本篇文章所畫(huà)的完整的UML類(lèi)圖。

這里寫(xiě)圖片描述

到此,本篇文章真的結(jié)束了,若文章有不足或者錯(cuò)誤的地方,歡迎指正,以防止給其他讀者錯(cuò)誤引導(dǎo)。最后感謝LoveLion的系列文章。

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

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

  • 在UML 2.0的13種圖形中,類(lèi)圖是使用頻率最高的UML圖之一。Martin Fowler在其著作《UML Di...
    雷雷_zll閱讀 13,519評(píng)論 0 14
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,807評(píng)論 3 93
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,741評(píng)論 18 399
  • 忘記了uml類(lèi)圖連線(xiàn)之間的關(guān)系,記錄一下。 1. 關(guān)聯(lián)關(guān)系 關(guān)聯(lián)(Association)關(guān)系是類(lèi)與類(lèi)之間最常用的...
    cutieagain閱讀 2,011評(píng)論 0 2
  • 喬幫主在發(fā)布會(huì)上提到,用戶(hù)的手才是最好的輸入設(shè)備,的確,iPhone之后,非觸屏手機(jī)再已難覓。觸摸是最基本的用戶(hù)輸...
    皮皮Warrior閱讀 2,381評(píng)論 3 48

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