目錄
- 1. UML定義
- 2. UML結構
- 2.1 視圖(View)
- 2.2 圖(Diagram)
- 2.3 模型元素(Model element)
- 2.4 通用機制(General mechanism)
- 3. 類圖
- 3.1 類與類圖
- 3.2 類之間的關系
- 3.2.1 關聯關系
- 3.2.2 聚合關系
- 3.2.3 組合關系
- 3.2.4 依賴關系
- 3.2.5 泛化關系
- 3.2.6 接口與實現關系
- 3.3 類圖實例
- 3.3.1 實例說明
- 3.3.2 實例解析
- 4. 順序圖
- 4.1 順序圖定義
- 4.2 順序圖組成元素與繪制
- 4.3 實例解析
- 5. 狀態圖
- 5.1 狀態圖定義
- 5.2 狀態圖組成元素與繪制
- 5.3 實例解析
- 參考
1. UML定義
??????Unified Modeling Language (UML)又稱統一建模語言或標準建模語言,是始于1997年一個OMG標準,它是一個支持模型化和軟件系統開發的圖形化語言,為軟件開發的所有階段提供模型化和可視化支持,包括由需求分析到規格,到構造和配置。 面向對象的分析與設計(OOA&D,OOAD)方法的發展在80年代末至90年代中出現了一個高潮,UML是這個高潮的產物。它不僅統一了Booch、Rumbaugh和Jacobson的表示方法,而且對其作了進一步的發展,并最終統一為大眾所接受的標準建模語言。
2. UML結構
2.1 視圖(View)
- 用戶視圖:以用戶的觀點表示系統的目標,它是所有視圖的核心,該視圖描述系統的需求。
- 結構視圖:表示系統的靜態行為,描述系統的靜態元素,如包、類與對象,以及它們之間的關系。
- 行為視圖:表示系統的動態行為,描述系統的組成元素如對象在系統運行時的交互關系。
- 實現視圖:表示系統中邏輯元素的分布,描述系統中物理文件以及它們之間的關系。
- 環境視圖:表示系統中物理元素的分布,描述系統中硬件設備以及它們之間的關系。
2.2 圖(Diagram)
應用視圖 | 圖名稱 | 說明 |
---|---|---|
用戶視圖 | 用例圖(Use Case Diagram) | 用于表示多個外部執行者與系統用例之間以及用例與用例之間的關系 |
結構視圖 | 類圖(Class Diagram) | 使用類來描述系統的靜態結構,類圖包含類和它們之間的關系,它描述系統內所聲明的類,但它沒有描述系統運行時類的行為 |
結構視圖 | 對象圖(Object Diagram) | 是類圖在某一時刻的一個實例,用于表示類的對象實例之間的關系 |
結構視圖 | 包圖(Package Diagram) | 用于描述包與包之間的關系,包是一種把元素組織到一起的通用機制,如可以將多個類組織成一個包 |
結構視圖 | 組合結構圖(Package Diagram) | 將每一個類放在一個整體中,從類的內部結構來審視一個類。組合結構圖可用于表示一個類的內部結構,用于描述一些包含復雜成員或內部類的類結構 |
行為視圖 | 狀態圖(State Diagram) | 用來描述一個特定對象的所有可能狀態及其引起狀態轉移的事件。一個狀態圖包括一系列對象的狀態及狀態之間的轉換 |
行為視圖 | 順序圖(Sequence Diagram) | 用于表示對象之間的交互,重點表示對象之間發送消息的時間順序 |
行為視圖 | 通信圖(Communication Diagram) | 展示了一組對象、這些對象間的連接以及它們之間收發的消息。它與順序圖是同構圖,也就是它們包含了相同的信息,只是表達方式不同而已,通信圖與順序圖可以相互轉換 |
行為視圖 | 定時圖(Timing Diagram) | 采用一種帶數字刻度的時間軸來精確地描述消息的順序,而不是像順序圖那樣只是指定消息的相對順序,而且它還允許可視化地表示每條生命線的狀態變化,當需要對實時事件進行定義時,定時圖可以很好地滿足要求 |
行為視圖 | 交互概覽圖(Interaction Overview Diagram) | 是交互圖與活動圖的混合物,可以把交互概覽圖理解為細化的活動圖,在其中的活動都通過一些小型的順序圖來表示;也可以將其理解為利用標明控制流的活動圖分解過的順序圖 |
實現視圖 | 組件圖(Component Diagram) | 用于描述每個功能所在的組件位置以及它們之間的關系 |
環境視圖 | 部署圖(Deployment Diagram) | 用于描述軟件中各個組件駐留的硬件位置以及這些硬件之間的交互關系 |
2.3 模型元素(Model element)
- 在UML中,模型元素包括事物以及事物與事物之間的聯系。事物是UML的重要組成部分,它代表任何可以定義的東西。事物之間的關系把事物聯系在一起,組成有意義的結構模型。每一個模型元素都有一個與之相對應的圖形元素。
- 同一個模型元素可以在不同的UML圖中使用,但是,無論在哪個圖中,同一個模型元素都保持相同的意義和符號
2.4 通用機制(General mechanism)
??????
UML提供的通用機制為模型元素提供額外的注釋、修飾和語義等,主要包括規格說明、修飾、公共分類和擴展機制四種。擴展機制允許用戶對UML進行擴展,以便一個特定的方法、過程、組織或用戶來使用
3. 類圖
3.1 類與類圖
??????在UML類圖中,類一般由三部分組成:
- 類名:每個類都必須有一個名字,類名是一個字符串
- 屬性(Attribites):屬性是指類的性質,即類的成員變量。類可以有任意多個屬性,也可以沒有屬性。
??????可見性 名稱:類型[=默認值]
- 操作(Operations):操作是類的任意一個實例對象都可以使用的行為,操作是類的成員方法
3.2 類之間的關系
3.2.1 關聯關系
??????關聯關系(Association)是類與類之間最常用的一種關系,它是一種結構化關系,用于表示一類對象與另一類對象之間有聯系。
??????在UML類圖中,用實線連接有關聯的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關系時,通常將一個類的對象作為另一個類的屬性。
??????在使用類圖表示關聯關系時可以在關聯線上標注角色名。
- 關聯關系
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 Product{...
}
- 自關聯
??????在系統中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯關系稱為自關聯
public class Node{private Node sunNode;...
}
- 重數性關聯
??????重數性關聯關系又稱為多重性關聯關系(Multiplicity),表示一個類的對象與另一個類的對象連接的個數。在UML中多重性關系可以直接在關聯直線上增加一個數字表示與之對應的另一個類的對象的個數
表示方式 | 多重性說明 |
---|---|
1...1 | 表示另一個類的一個對象只與一個該類對象有關系 |
0..* | 表示另一個類的一個對象與零個或多個該類對象有關系 |
1..* | 表示另一個類的一個對象與一個或多個該類對象有關系 |
0..1 | 表示另一個類的一個對象沒有或與一個該類對象有關系 |
m..n | 表示另一個類的一個對象與最少m、最多n個該類對象有關系(m<=n) |
public class Form{private Button buttons;...
}
public class Button{...
}
3.2.2 聚合關系
??????聚合關系(Aggregation)表示一個整體與部分的關系。通常在定義一個整體類后,再去分析這個整體類的組成結構,從而找出一些成員類,該整體類和成員類之間就形成了聚合關系。
??????在聚合關系中,成員類是整體類的一部分,即成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在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.2.3 組合關系
??????組合關系(Composition)也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在,部分對象與整體對象之間具有同生共死的關系。
??????在組合關系中,成員類是整體類的一部分,而且整體類可以控制成員類的生命周期,即成員類的存在依賴于整體類。在UML中,組合關系用帶實心菱形的直線表示。
public class Head{private Mouth mouth;public Head(){mouth=new Mouth();}...
}
public class Mouth{...
}
3.2.4 依賴關系
??????依賴關系(Dependency)是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系。大多數情況下,依賴關系體現在某個類的方法使用另一個類的對象作為參數。
??????在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
public class Driver{public void drive(Car car){car.move();}...
}
public class Car{public void move(){...}...
}
3.2.5 泛化關系
??????泛化關系(Generalization)也就是繼承關系,也稱為“is-a-kind-of”關系,泛化關系用于描述父類與子類之間的關系,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛化關系用帶空心三角形的直線來表示。
??????在代碼實現時,使用面向對象的繼承機制來實現泛化關系,如在Java語言中使用extends關鍵字、在C++/C#中使用冒號“:”來實現。
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(){...}
}public class Teacher extends Person{private String teacherNo;public void teach(){...}
}
3.2.6 接口與實現關系
??????接口之間也可以有與類之間關系類似的繼承關系和依賴關系,但是接口和類之間還存在一種實現關系(Realization),在這種關系中,類實現了接口,類中的操作實現了接口中所聲明的操作。在UML中,類與接口之間的實現關系用帶空心三角形的虛線來表示。
public interface Vehicle{public void move();
}public class Ship implements Vehicle{public void move(){...}
}public class Car implements Vehicle{public void move(){...}
}
3.3 類圖實例
3.3.1 實例說明
??????某基于Java語言的C/S軟件需要提供注冊功能,該功能簡要描述如下:
- 用戶通過注冊界面(RegisterForm)輸入個人信息,用戶點擊“注冊”按鈕后將輸入的信息通過一個封裝用戶輸入數據的對象(UserDTO)傳遞給操作數據庫的數據訪問類(DAO),為了提高系統的擴展性,針對不同的數據庫可能需要提供不同的數據訪問類,因此提供了數據訪問類接口,如IUserDAO,每一個具體數據訪問類都是某一個數據訪問類接口的實現類,如OracleUserDAO就是一個專門用于訪問Oracle數據庫的數據訪問類。
- 根據以上描述繪制類圖。為了簡化類圖,個人信息僅包括賬號(userAccount)和密碼(userPassword),且界面類無須涉及界面細節元素。
3.3.2 實例解析
4. 順序圖
??????順序圖是最常用的系統動態建模工具之一,也是使用頻率最高的交互圖。它用于表示對象之間的動態交互,而且以圖形化的方式描述了對象間消息傳遞的時間順序。
4.1 順序圖定義
??????順序圖(Sequence Diagram)是一種強調對象間消息傳遞次序的交互圖,又稱為時序圖或序列圖。
??????順序圖以圖形化的方式描述了在一個用例或操作的執行過程中對象如何通過消息相互交互,說明了消息如何在對象之間被發送和接收以及發送的順序。順序圖允許直觀地表示出對象的生存期,在生存期內,對象可以對輸入消息做出響應,還可以發送信息。
??????在軟件系統建模中,順序圖的使用很靈活,通常包括如下兩種順序圖:
- 需求分析階段的順序圖:主要用于描述用例中對象之間的交互,可以使用自然語言來繪制,用于細化需求,它從業務的角度進行建模,用描述性的文字敘述消息的內容。
- 系統設計階段的順序圖:確切表示系統設計中對象之間的交互,考慮到具體的系統實現,對象之間通過方法調用傳遞消息。
4.2 順序圖組成元素與繪制
??????在UML中,順序圖將交互關系表示為一個二維圖,縱向是時間軸,時間沿豎線向下延伸;橫向軸表示了在交互過程中的獨立對象,對象的活動用生命線表示。順序圖由執行者(Actor)、生命線(Lifeline)、對象(Object)、激活框(Activation)和消息(Message)等元素組成。
- 執行者是交互的發起人,使用與用例圖一樣的“小人”符號表示,在有些交互過程中無須使用執行者。
- 生命線用一條縱向虛線表示。
- 對象表示為一個矩形,其中對象名稱標有下劃線。
- 激活是過程的執行,包括等待過程執行的時間。在順序圖中激活部分替換生命線,使用長條的矩形表示。
- 消息是對象之間的通信,是兩個對象之間的單路通信,是從發送者到接收者之間的控制信息流。消息在順序圖中由有標記的箭頭表示,箭頭從一個對象的生命線指向另一個對象的生命線,消息按時間順序在圖中從上到下排列。
??????一個復雜的順序圖可以劃分為幾個小塊,每一個小塊稱為一個交互片段(Interaction Fragment)。每個交互片段由一個大方框包圍,在方框左上角的間隔區內標注該交互片段的操作類型,該操作類型用操作符表示,常用的操作符包括:
- alt:多條路徑,條件為真時執行。
- opt:任選,僅當條件為真時執行。
- par:并行,每一片段都并發執行。
- loop:循環,片段可多次執行。
實例如圖:
??????在順序圖中,有的消息對應于激活,表示它將會激活一個對象,這種消息稱為調用消息(Call Message);如果消息沒有對應激活框,表示它不是一個調用消息,不會引發其他對象的活動,這種消息稱為發送消息(Send Message);如果對象的一個方法調用了自己的另一個方法時,消息是由對象發送給自身,這種消息稱為自身消息(Self Call Message)。
??????順序圖中的消息還包括創建消息和銷毀消息,創建消息用于使用new關鍵字創建另一個對象,而銷毀消息用于調用對象的銷毀方法將一個對象從內存中銷毀。
如圖所示:
4.3 實例解析
- 某基于Java EE的B/S系統需要提供登錄功能,該功能簡要描述如下:用戶打開登錄界面login.jsp輸入數據,向系統提交請求,系統通過Servlet獲取請求數據,將數據傳遞給業務對象,業務對象接收數據后再將數據傳遞給數據訪問對象,數據訪問對象對數據庫進行操作,查詢用戶信息,再返回查詢結果。
- 根據以上描述繪制順序圖。
5. 狀態圖
??????對于系統中那些具有多種狀態的對象,狀態圖是一種常用的建模手段。狀態圖用于描述對象的各種狀態以及狀態之間的轉換。
5.1 狀態圖定義
??????狀態圖(Statechart Diagram)用來描述一個特定對象的所有可能狀態及其引起狀態轉移的事件。
??????我們通常用狀態圖來描述單個對象的行為,它確定了由事件序列引出的狀態序列,但并不是所有的類都需要使用狀態圖來描述它的行為,只有那些具有重要交互行為的類,我們才會使用狀態圖來描述,一個狀態圖包括一系列的狀態及狀態之間的轉移。
??????大多數面向對象技術都使用狀態圖來描述一個對象在其生命周期中的行為,對象從產生到結束,可以處于一系列不同的狀態。
??????狀態影響對象的行為,當這些狀態的數目有限時,就可以用狀態圖來建模對象的行為,狀態圖顯示了單個類的生命周期,在不同狀態下對象可能具有不同的行為。
??????狀態圖適用于描述在不同用例之間的對象行為,但并不適合于描述包括若干協作的對象行為,因為一個狀態圖只能用于描述一個類的對象狀態,如果涉及到多個不同類的對象,則需要使用活動圖。
5.2 狀態圖組成元素與繪制
- 狀態(State):又稱為中間狀態,用圓角矩形框表示,在一個狀態圖中可有多個狀態,每個狀態包含兩格:上格放置狀態名稱,下格說明處于該狀態時對象可以進行的活動(Action)。
- 初始狀態(Initial State):又稱為初態,用一個黑色的實心圓圈表示,在一個狀態圖中只能夠有一個初始狀態。
- 結束狀態(Final State):又稱為終止狀態或終態,用一個實心圓外加一個圓圈表示,在一個狀態圖中可能有多個結束狀態。
- 轉移(Transition):用從一個狀態到另一個狀態之間的連線和箭頭說明狀態的轉移情況,并用文字說明引發這個狀態變化的相應事件是什么。事件有可能在特定的條件下發生,在UML中這樣的條件稱為守護條件(Guard Condition),發生事件時的處理也稱為動作(Action)。狀態之間的轉移可帶有標注,由三部分組成(每一部分都可省略),其語法為:事件名 [條件] / 動作名。
??????在一個狀態圖中,一個狀態也可以被細分為多個子狀態,包含多個子狀態的狀態稱為復合狀態。
5.3 實例解析
??????某信用卡系統賬戶具有使用狀態和凍結狀態,其中使用狀態又包括正常狀態和透支狀態兩種子狀態。如果賬戶余額小于零則進入透支狀態,透支狀態時既可以存款又可以取款,但是透支金額不能超過5000元;如果余額大于零則進入正常狀態,正常狀態時既可以存款又可以取款;如果連續透支100天,則進入凍結狀態,凍結狀態下既不能存款又不能取款,必須要求銀行工作人員解凍。用戶可以在使用狀態或凍結狀態下請求注銷賬戶。根據上述要求,繪制賬戶類的狀態圖。
參考
- 《設計模式》課件-劉偉