Understanding UML in seconds

2023-09-13 15:00:22

UML 是一種分析設計語言,也就是一種建模語言。

UML結構解析

UML其結構主要包括以下幾個部分:

  • 檢視(View)
    多個圖形組成的集合;
  • 圖(Diagram)
    圖的種類有13種圖,但常用的也就兩種(1.需求用例圖,2.開發類圖);
  • 模型元素(Model Element)
    如類、物件、訊息以及這些概念之間的關係,如關聯關係、依賴關係、泛化關係等;
  • 通用機制(General Mechanism)
    UML提供的通用機制為模型元素提供額外的註釋、資訊和語意(沒啥用);

開發類圖

類圖(Class Diagram)主要用來描述不同的類以及它們之間的關係。

類圖的三段式結構為:

類名
類的屬性
類的操作

類圖範例:

對應的Java範例程式碼:

觀察後發現,範例類圖和範例程式碼的差別不大,無非是型別寫在變數後面而已。

UML規定類屬性的表示方式為:

UML規定類操作的表示方式為:

注意:如果是構造方法,則無返回型別。

其中:可見性表示該屬性對於類外的元素而言是否可見,包括:

  • 公有(public), 在類圖中分別用符號 +表示;
  • 私有(private), 在類圖中分別用符號 -表示;
  • 受保護(protected),在類圖中分別用符號 表示;
    表示這個元素或這個方法對這個類及其子類的其他元素存取。
  • 包可見性,對同一個包中的其他元素可見,在類圖中分別用符號 * 表示;
    表示這個元素可以被其所屬類的子類以及與其所屬類處於同一包中的其他類所存取。

類圖間的關係

一共九種關聯關係,他們的符號可以記不住,這個沒關係,用到再回來查。但是,他們各個圖間的關係概念得分辨明晰,不要有含混不明的地方。

  1. 關聯關係(有6種)
    • 1.1 雙向關聯
      • 預設情況下,關聯是雙向的;
      • 在UML種用一個根實線連線兩個類表示。
    • 1.2 單向關聯
      • 類的關聯關係也可以是單向的,在UML中單向關聯用帶箭頭的實線表示。
    • 1.3 自關聯
      • 在系統中可能會存在一些類的屬性物件型別為該類本身,這種特殊的關聯關係稱為自關聯。
    • 1.4 多重關聯
      • 表示兩個關聯物件在數量上的對應關係;
      • 在UML中,物件之間的多重性可以直接在關聯直線上用一個數位或一個數位範圍表示。
    • 1.5 聚合關係(Aggregation)
      • 聚合關係表示整體與部分的關係;
      • 組合關係與聚合關係的區別在於生命週期的管理。在聚合關係中,整體物件和部分物件之間的關聯是比較寬鬆的,部分物件可以獨立存在而不受整體物件的控制。
      • 在UML中,聚合關係用帶空心菱形的直線表示。
    • 1.6 組合關係(Composition)
      • 組合關係表示類之間整體和部分的關係;
      • 組合關係與聚合關係的區別在於生命週期的管理。在組合關係中,整體物件擁有和管理部分物件的全生命週期
      • 在UML中,組合關係用帶實心菱形的直線表示;
  2. 依賴關係
    • 依賴(Dependency)關係是一種使用關係;
    • 大多數情況下,依賴關係體現在某個類的方法使用另一個類的物件作為引數。
    • 在UML中,依賴關係用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
  3. 泛化關係
    • 泛化(Generalization)關係也就是繼承關係,用於描述父類別與子類之間的關係;
    • 在UML中,泛化關係用帶空心三角形的直線來表示。
  4. 介面與實現關係
    • 在介面中,通常沒有屬性,而且所有的操作都是抽象的,只有操作的宣告,沒有操作的實現;
    • 介面之間也可以有與類之間關係類似的繼承關係和依賴關係,但是介面和類之間還存在一種實現(Realization)關係。在這種關係中,類實現了介面,類中的操作實現了介面中所宣告的操作。
    • 在UML中,類與介面之間的實現關係用帶空心三角形的虛線來表示。

雙向關聯

  • 雙向關聯類似 我擁有你,你也擁有我;
  • 在UML種用一個根實線連線兩個類表示。

例如,顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。因此,Customer類和Product類之間具有雙向關聯關係,如下圖。

public class Customer {
    private Product[] products;
}

public class Product {
    private Customer customer;
}

單向關聯

  • 類的關聯關係也可以是單向的,就類似 我擁有你,但你不能擁有我;
  • 在UML中單向關聯用帶箭頭的實線表示。

public class Customer {
    private Address address;
}

public class Address {}

自關聯

  • 這個也是單向關聯,只是指向的不是別人,是自己。
  • 在系統中可能會存在一些類的屬性物件型別為該類本身,這種特殊的關聯關係稱為自關聯。
  • 例如,一個節點類(Node)的成員又是節點Node型別的物件,

public class Node {
    private Node node;
}

多重性關聯

這個應該是最複雜的,需要好好看看;

  • 又稱為重數性(Multiplicity)關聯關係,表示兩個關聯物件數量上的對應關係
  • 多重性應用於關聯的目標端,說明源類的每個範例與目標類範例的連線個數。除非顯式說明,否則關係的多重性就是未指定的。
  • 在UML類圖中,關係連線的兩端有時會有1..1、*..1等符號,通過下圖來做一個說明。

用一個數位或一個數位範圍表示, 這裡的數位範圍一遍指符號,下面有說明表格。
符號說明:

例如:一個介面(Form)可以擁有零個或多個按鈕(Button),但是一個按鈕只能屬於一個介面,因此,一個Form類的物件可以與零個或多個Button類的物件相關聯,但一個Button類的物件只能與一個Form類的物件關聯,如下圖:

對應的Java程式碼:

public class Form {
  private Button[] buttons; //定義一個集合物件
}
 
public class Button {}

注意: 類之間的多重性有時會直接在關係連線上用一個數位表示,其實這種是不嚴謹的表示法,
多重性描述的是關係連線的兩端,自然要將兩端的範圍都描述清楚,只寫一個數位,會讓人不清楚是頭還是尾,引起混亂!

聚合關係

  • 是一種描述 整體與成員間的關係;
  • 在聚合關係中,成員物件是整體物件的一部分,但是成員物件可以脫離整體物件獨立存在;
  • 簡而言之,整體死去了,成員還活著
  • 在UML中,聚合關係用帶空心菱形的直線表示。

在程式碼實現聚合關係時,成員物件通常作為構造方法Setter\Getter方法業務方法的引數注入到整體物件中,對應的Java程式碼片段如下:

public class Car {
	private Engine engine;
 
    //構造注入
	public Car(Engine engine) {
		this.engine = engine;
	}
    
    //設值注入
    public void setEngine(Engine engine) {
      this.engine = engine;
    }
}
 
public class Engine {
	// ...
}

組合關係

  • 是一種描述 整體與成員間的關係;
  • 在組合關係中整體物件可以控制成員物件的生命週期,一旦整體物件不存在,成員物件也將不存在,成員物件與整體物件之間具有同生共死的關係
  • 簡而言之,整體死去了,成員也死了
  • 在UML中,組合關係用帶實心菱形的直線表示;

例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關係。

public class Head {
	private Mouth mouth;
 
	public Head() {
		this.mouth = new Mouth(); //範例化成員類
	}

}
 
public class Mouth {
	// ...
}

依賴關係案例

在UML中,依賴關係用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。

對應的Java程式碼:

public class Driver {
  public void drive(Car car){
    car.move();
  }
}

public class Car {
  public void move(){
    // ...  
  }
}

泛化關係案例

在UML中,泛化關係用帶空心三角形的直線來表示。

對應的Java程式碼:

//父類別
public class Person (
  protected String name;
  protected int age;

  public void move( ) {
    // ...
  }
  public void say( ) {
    // ...
  }
}

//子類
public class Student extends Person {
  private String teacherNo;

  public void study( ) {
    // ...
  }
}

//子類
public class Teacher extends Person {
  private String teacherNo;

  public void teach() {
    // ...
  }
}

介面與實現關係案例

在UML中,類與介面之間的實現關係用帶空心三角形的虛線來表示。

對應的Java程式碼

public interface Vehicle {
  public void move() 
}

public class Ship implements Vehicle {
  public void move(){
    // ...
  }
}

public class Car implements Vehicle {
  public void move() {
    // ...
  }
}