1. 程式人生 > >設計模式——統一建模語言UML

設計模式——統一建模語言UML

目錄

  • 一、UML的結構
    • 1.1檢視
    • 1.2圖
    • 1.3模型元素
  • 二、類圖
    • 2.1類與類圖
    • 2.2類之間的關係
  • 三、序列圖
    • 3.1序列圖定義
    • 3.2序列圖組成元素與繪製
  • 四、狀態圖
    • 4.1狀態圖定義
    • 4.2狀態圖組成元素與繪製

在一個現代化的工程中,人們要相互溝通和合作,就必須使 用標準的工業化設計語言對待開發的產品進行建模

建模過程把複雜的問題分解成為易於理解的小問題,以達到問題的求解;其目的是把所要設計的結構和系統的行為聯絡起來,並對系統的結構進行視覺化控制

一、UML的結構

1.1檢視

  • 使用者檢視:以使用者的觀點表示系統的目標,是所有檢視的核心,該檢視描述系統的需求
  • 結構檢視:表示系統的靜態行為,描述系統的靜態元素,如包、類與物件,以及它們之間的關係
  • 行為檢視:表示系統的動態行為,描述系統的組成元素,如物件在系統執行時的 互動關係
  • 實現檢視:表示系統中邏輯元素的分佈,描述系統中物理檔案以及它們之間的關係
  • 環境檢視:表示系統中物理元素的分佈,描述系統中硬體裝置以及它們之間的關係

1.2圖

  • 用例圖:對應使用者檢視。用例圖通過用例來表示系統的功能需求。用例圖用於表示多個外部執行者與系統用例之間以及用例與用例之間的關係。用例圖與用例說明文件是常用的需求建模工具
  • 類圖:對應結構檢視。類圖使用類描述系統的靜態結構。類圖包含類和它們之間的關係,它描述系統內所宣告的類,但它沒有描述系統執行時類的行為
  • 物件圖:對應結構檢視。物件圖是類圖在某一時刻的一個例項,用於表示類的物件之間的關係
  • 狀態圖:對應行為檢視。狀態圖描述一個特定物件的所有可能狀態及其引起狀態轉移的事件。一個狀態圖包括一系列物件的狀態及狀態之間的轉換
  • 活動圖:對應行為檢視。活動圖表示系統中各種活動的次序,其應用非常廣泛,既可用來描述用例的工作流程,也可以用來描述類中某個方法的操作行為
  • 序列圖:又稱時序圖,對應行為檢視。順序圖表示物件之間的互動,重點表示物件之間傳送訊息的時間順序
  • 協作圖:對應行為檢視。協作圖展示了一組物件、這些物件間的連線以及它們之間收發的訊息。它與序列圖是同構圖,包含了相同的資訊,只是表達方式不同而已,協作圖與序列圖可以相互轉換
  • 構件圖:對應實現檢視。構件圖描述每個功能所在的元件位置以及它 們之間的關係
  • 部署圖:對應於環境檢視。部署圖描述軟體中各個元件駐留的硬體位置以及這些硬體之間的互動關係

1.3模型元素

在 UML中,模型元素包括事物以及事物與事物之間的聯絡

事物是 UML的重要組成部分,它代表任何可以定義的東西。事物之間的關係把事物聯絡在一起,組成有意義的結構模型。每一個模型元素都有一個與之相對應的圖形元素

二、類圖

2.1類與類圖

類封裝了資料和行為,是面向物件的重要組成部分,它是具有相同屬性、操作、關係的物件集合的總稱

在系統中,每個類具有一定的職責,即類要完成什麼樣的功能。一個類可以有多種職責,設計得好的類一般只有 一種職責

定義類的時候,將類的職責分解成為類的屬性和操作(即方法)。類的屬性即類的資料職責,類的操作即類的行為職責

UML類圖中,類一般由三部分組成

  • 類名:每個類都必須有一個名字,類名是一個字串
  • 屬性:指類的性質,即類的成員變數。類可以有任意多個屬性,也可以沒有屬性。可見性 名稱:型別 [= 預設值]
  • 操作:操作是類的任意一個例項物件都可以使用 的行為,操作是類的成員方法

2.2類之間的關係

(1)關聯關係

關聯關係是類與類之間最常用的一種關係,用於表示一類物件與另一類物件之間的聯絡

在 UML類圖中,用實線連線有關聯的物件所對應的類

在使用類圖表示關聯關係時可以在關聯線上標註角色名

public class LoginForm {
    private JButton loginButton;
    ……
}
public class JButton {
    ……
}
  • 雙向關聯:預設情況下,關聯是雙向的

    public class Customer {
        private Product[] products;
        ……
    }
    public class Product {
        private Customer customer;
        ……
    }
  • 單向關聯:用帶箭頭的實線表示

    public class Customer {
        private Address address;
        ……
    }
    public class Address {
        ……
    }
  • 自關聯:一些類的屬性物件型別為該類本身

    public class Node {
        private Node subNode;
        ……
    }
  • 重數性關聯:表示 一個類的物件與另一個類的物件連線的個數

    public class Form {
        private Button buttons[];
        ……
    }
    public class Button {
        …
    }
表示方式 多重性說明
1..1 表示另一個類的一個物件只與一個該類物件有關係
0..* 表示另一個類的一個物件與零個或多個該類物件有關係
1..* 表示另一個類的一個物件與一個或多個該類物件有關係
0..1 表示另一個類的一個物件沒有或只與一個該類物件有關係
m..n 表示另一個類的一個物件與最少m、最多n個該類物件有關係 (m<=n)

(2)聚合關係

聚合關係表示整體與部分的關係。通常在定義一個整體類後,再去分析這個整體類的組成結構,從而找出一些成員類,該整體類和成員類之間就形成了聚合關係

在聚合關係中,成員類是整體類的一部分,成員物件是整體物件的一部分,但是成員物件可以脫離整體物件獨立 存在

UML中,聚合關係用帶空心菱形的直線表示

public class Car {
    private Engine engine;
    
    public Car(Engine engine) {
        this.engine = engine;
    }
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
    
    ……
}
public class Engine {
    ……
}

(3)組合關係

組合關係也表示類之間整體和部分的關係, 但是組合關係中部分和整體具有統一的生存期。一旦整體物件不存在,部分物件也將不存在

在組合關係中,成員類是整體類的一部分,而且整體類可以控制成員類的生命週期,即成員類的存在依賴於整體類

UML中,組合關係用帶實心菱形的直線表示

public class Head {
    private Mouth mouth;
    
    public Head() {
        mouth = new Mouth();
    }
    
    ……
}
public class Mouth {
    ……
}

(4)依賴關係

依賴關係是一種使用關係,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關係

大多數情況下,依賴關係體現在某個類的方法使用另一個類的物件作為引數

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

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

(5)泛化關係

泛化關係即繼承關係

泛化關係用於描述父類與子類之間的關係,父類又稱作基類或超類,子類又稱作派 生類

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

public class Person {
    protected String name;
    protected int age;
    
    public void move() {
        ……
    }
    public void say() {
        ……
    }
}
public class Student extends Person {
    private String studentNo;
    
    public void study() {
        ……
    }
}

(6)介面與實現關係

介面之間也可以有與類之間關係類似的繼承關係和依賴關係,但是介面和類之間還存在一種實現關係,在這種關係中,類實現了介面,類中的操作實現了介面中所宣告的操作

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

public interface Vehicle  {
    public void move();
}
public class Ship implements Vehicle {
    public void move() {
        ……
    }
}
public class Car implements Vehicle {
    public void move() {
        ……
    }
}

舉例

某基於Java語言的C/S軟體需要提供註冊功能,該功能簡要描述如下:

使用者通過註冊介面(RegisterForm)輸入個人資訊,使用者點選“註冊”按鈕後將輸入的資訊通過一個封裝使用者輸入資料的物件(UserDTO)傳遞給操作資料庫的資料訪問類(DAO),為了提高系統的擴充套件性,針對不同的資料庫可能需要提供不同的資料訪問類,因此提供了資料訪問類介面,如 IUserDAO,每一個具體資料訪問類都是某一個數據訪問類介面的實現類,如 OracleUserDAO就是一個專門用於訪問Oracle資料庫的資料訪問類

根據以上描述繪製類圖。為了簡化類圖,個人資訊僅包括賬號(userAccount)和密碼(userPassword),且介面類無須涉及介面細節元素

三、序列圖

用於表示物件之間的動態互動,而且以圖形化的方式描述了物件間訊息傳遞的時間順序

3.1序列圖定義

序列圖是一種強調物件間訊息傳遞次序的互動圖,又稱時序圖。它以圖形化的方式描述了在一個用例或操作的執行過程中物件如何通過訊息相互互動,說明了訊息如何在物件之間被髮送和接收以及傳送的順序

序列圖通常有兩種

  • 需求分析階段的序列圖:主要用於描述用例中物件之間的互動,可以使用自然語言繪製,用於細化需求,它從業務的角度進行建模,用描述性的文字敘述訊息的內容
  • 系統設計階段的序列圖:確切表示系統設計中物件之間的互動,考慮到具體的系統實現,物件之間通過方法呼叫傳遞訊息

3.2序列圖組成元素與繪製

UML中,序列圖將互動關係表示為一個二維圖,縱向軸表示時間軸,時間沿豎線向下延伸;橫向軸表示在互動過程中的獨立物件,物件的活動用生命線表示。序列圖由執行者、生命線、 物件、啟用框和訊息等元素組成

執行者是互動的發起人,使用與用例圖一樣的“小人”符號表示,有些互動過程無須使用執行者

生命線用一條縱向虛線表示

物件表示為一個矩形,其中物件名稱標有下劃線

啟用是過程的執行,包括等待過程執行的時間。在序列圖中啟用部分替換生命線,使用長條的矩形表示

訊息是物件之間的通訊,是兩個物件之間的單路通訊,是從傳送者到接收者之間的控制資訊流。訊息在序列圖中由有標記的箭頭表示,箭頭從一個物件的生命線指向另一個物件的生命線,訊息按時間順序在圖中從上到下排列

一個複雜的序列圖可以劃分為幾個小塊,每一個小塊稱為一個互動片段。每個互動片段由一個大方框包圍,在方框左上角的間隔區內標註該互動片段的操作型別,該操作型別用操作符表示,常用的操作符包括:

  • alt:多條路徑,條件為真時執行
  • opt:任選,僅當條件為真時執行
  • par:並行,每一片段都併發執行
  • loop:迴圈,片段可多次執行

在序列圖中,有的訊息對應於啟用,表示它將會啟用一個物件,這種訊息稱為呼叫訊息;如果訊息沒有對應啟用框,表示它不是一個呼叫訊息,不會引發其他物件的活動,這種訊息稱為傳送訊息;如果物件的一個方法呼叫了自己的另一個方法時,訊息是由物件傳送給自身,這種訊息稱為自身訊息。序列圖中的訊息還包括建立訊息和銷燬訊息,建立訊息用於使用 new關鍵字建立另一個物件,而銷燬訊息用於呼叫物件的銷燬方法將一個物件從記憶體中銷燬

舉例

某基於Java EE的B/S系統需要提供登入功能,該功能簡要描 述如下:使用者開啟登入介面login.jsp輸入資料,向系統提交請 求,系統通過Servlet獲取請求資料,將資料傳遞給業務物件, 業務物件接收資料後再將資料傳遞給資料訪問物件,資料訪 問物件對資料庫進行操作,查詢使用者資訊,再返回查詢結果

四、狀態圖

用於描述物件的各種狀態以及狀態之間的轉換

4.1狀態圖定義

通常用狀態圖來描述單個物件的行為,它確定了由事件序列引出的狀態序列,但並不是所有的類都需要使用狀態圖來描述它的行為,只有那些具有重要互動行為的類,我們才會使用狀態圖來描述

大多數面向物件技術都使用狀態圖來描述一個物件在其生命週期中的行為,物件從產生到結束,可以處於一系列不同的狀態。狀態影響物件的行為,當這些狀態的數目有限時,就可以用狀態圖來建模物件的行為,狀態圖顯示了單個類的生命週期,在不同狀態下物件可能具有不同的行為

4.2狀態圖組成元素與繪製

狀態:又稱為中間狀態,用圓角矩形框表示,在一個狀態圖中可有多個狀態,每個狀態包含兩格:上格放置狀態名稱,下格說明處於該狀態時物件可以進行的活動

初始狀態:又稱為初態,用一個黑色的實心圓圈表示,在一個狀態圖中只能夠有一個初始狀態

結束狀態:又稱為終止狀態或終態,用一個實心圓外加一個圓圈表示,在一個狀態圖中可能有多個結束狀態

轉移:用從一個狀態到另一個狀態之間的連線和箭頭說明狀態的轉移情況,並用文字說明引發這個狀態變化的相應事件是什麼。事件有可能在特定的條件下發生,在 UML中這樣的條件稱為守護條件,發生事件時的處理也稱為動作。狀態之間的轉移可帶有標註,由三部分組成(每一部分都可省略),其語法為:事件名 [條件] / 動作名

在一個狀態圖中,一個狀態也可以被細分為多個子狀態,包含多個子狀態的狀態稱為複合狀態

舉例

某信用卡系統賬戶具有使用狀態和凍結狀態,其中使用狀態又包括正常狀態和透支狀態兩種子狀態。如果賬戶餘額小於零則進入透支狀態,透支狀態時既可以存款又可以取款,但是透支金額不能超過5000元;如果餘額大於零則進入正常狀態,正常狀態時既可以存款又可以取款;如果連續透支100天,則進入凍結狀態,凍結狀態下既不能存款又不能取款,必須要求銀行工作人員解凍。使用者可以在使用狀態或凍結狀態下請求登出賬戶