1. UML的模型圖
UML 的模型圖能夠將被建模的系統的某一個方面的某一部分以圖形的方式表示出來,不同的視圖通過將多個不同的模型圖有機組合在一起就能夠描述系統模型的某方面的特徵。UML的模型圖是有模型元素構成的,模型元素以表徵圖的形式直觀形象的表達各種概念。有的模型元素可以在多個模型圖中使用,如注釋和注釋串連可以在任何模型圖中使用,用於給其他的模型元素進行注釋。各種模型圖能使用的模型元素集合也不相同,在介紹各種模型圖的時候會有具體的說明。
UML 定義了九種模型圖:使用案例圖(Use Case View)、類圖(Class Diagram)、對象圖(Object Diagram)、構件圖(Component Diagram)、部署圖(Deployment Diagram)、狀態圖(StateChart Diagram)、活動圖表(Activity Diagram)、順序圖表(Sequence Diagram)以及共同作業圖表(Collaboration Diagram)。這九種模型圖各有側重,如使用案例圖側重描述使用者需求,類圖側重描述系統具體實現;描述的方面都不相同,如類圖描述的是系統的結構,順序圖表描述的是系統的行為;抽象的層次也不同,如構件圖描述系統的模組結構,抽象層次較高,類圖是描述具體模組的結構,抽象層次一般,對象圖描述了具體的模組實現,抽象層次較低。 在有的文獻書籍中,將這九種模型圖分為三大類:結構分類、動態行為和模型管理,結構分類包括使用案例圖、類圖、對象圖、構件圖和部署圖,動態行為包括狀態圖、活動圖表、順序圖和共同作業圖表,模型管理則包含類圖。本文則從動態和靜態角度分別介紹UML的九種模型圖。
2. 靜態模型圖
結構分類模型圖描述了的是系統的與時間不相關的屬性和行為。靜態模型圖包括類圖、對象圖、構件圖和部署圖。
2.1 類圖
類圖描述的是類和類之間的相互關係。類在UML中的是用矩形表示,矩形中可以有三個地區,最上方的地區是名字域,用來顯示類名,中間的地區是屬性域,用來顯示類所具有的屬性列表,最下方的地區是操作地區,顯示定義的巨集指令清單,2.2.1所示。
圖2.2.1 中,屬性自己也含有屬性,如名字,類型,可見度等,屬性的名字就是識別屬性的名稱,屬性的類型就是屬性所屬於的資料類型,屬性的可見度識別屬性是否能被所屬類之外的類直接存取,屬性的可見度分為三種:public,protected和private。public標識的是對應屬性可以被所屬的類和其他類直接存取;protected標識的是對應屬性可以被與所屬類相關的一系列類的訪問,這些類的相關性不同的物件導向程式設計語言有不同的定義,如C++中 protected是標識的是屬效能夠被以public方式繼承的子類訪問,在JAVA中則是識別屬性可以被在同一個包(package)的所有類訪問; private標識的是屬性只能被所屬類訪問。操作的屬性有名字、傳回型別、參數類型以及可見度等,名字是操作的名稱;傳回型別是操作的傳回值的類型;參數類型是傳入操作的參數類型;可見度標識的是操作是否能被被所屬類之外的類直接存取,也分為:public、protected和private。有時為了表達簡潔,可以省去顯示類的各種屬性和操作。 類之間的相互關係包括:關聯(Association)、依賴(Dependency)、泛化(Generalization)以及實現(Realize)。 關聯描述的是類的對象之間邏輯上的關係,這些對象可以是同類的,也可以不是,關聯的兩端稱為角色,如客戶和訂單就存在一種關聯。在UML中關聯主要有三種形式,一種是用一條線段標識雙向的關聯,稱為關聯(Association);第二種是用一個有箭頭的線段標識單向的關聯(Unidirectinal Association);第三中是用一個菱形為頭的線段表示關聯的兩端的類是整體和部分的關係,這種關聯也稱為彙總(Aggregation),例如:一個對象a包含另一個對象b的引用,則菱形的一端串連的是對象a,另一段串連的是對象b。彙總又分為。圖2.2.2顯示了這三種關聯的圖形表示。300)this.width=300" align="center" border="0" height="100" width="200">圖 2.2.2 三種關聯 從圖2.2.2中可以看到,NewClass2和NewClass4之間的關聯兩端都有星號,那是用於標識關聯的角色的多重性,如一對一、一對多、多對多等,這裡標識的是NewClass2和NewClass4是多對多關聯。 依賴表示的是模型元素間的依賴關係,依賴關係兩端的模型元素,一端是獨立的,另一端需要依賴這個獨立的元素。依賴關係用帶箭頭的虛線段表示。 泛化表示的是模型元素之間抽象和具體的關係,也就是模型元素之間的繼承關係。繼承者具有被繼承者相同的特性,同時還能在被繼承者的基礎上進行擴充,如:人和中國人的關係就是泛化關係,中國人是人,同時具有人的特徵,也有自己擴充了的特徵。在物件導向中,被繼承者稱為父類,繼承者稱為子類。泛化用一個帶有空心的三角箭頭的線段表示,三角箭頭指向父類,另一端串連子類。 實現關係表示一個模型元素實現了另一個模型元素定義的操作,一般是指一個類實現了一個介面(Interface)定義的方法,在物件導向的概念中,介面就是只定義方法,並不實現這個方法,用來給別的類繼承它,並用類的操作實現它定義方法,通過這樣的方法就能夠將定義和抽象分開,利於代碼的維護。實現關係用一條帶有空心三角箭頭的虛線段表示,三角形介面指向介面,虛線段另一端串連實作類別。 表達實現關係除了上面的這中表示外,UML還提供了另一種簡潔的表示方式,用一個圓圈表示介面,上面沒有介面定義的方法,通過用一條實線段將其與一個類相連,就能表示了介面和實作類別的關係。 泛化和實現關係都是描述一般和具體的關係,但是兩者還是有區別:泛化實在同一個抽象層次上的一般和具體的關係,而實現是在不同抽象層次的一般和具體的關係,介面的抽象層次較高。
2.2 對象圖
對象圖描述的是對象之間的關係,也可以理解為系統在某一個時刻的映像。對象圖是在比較具體的層次上描述,比如描述一個系統的各個類的對象是如何組合的。對象圖沒有類圖那麼複雜,對象的表示和類相似,只是在名字域要標明對象名和所屬類名,兩者用冒號分隔,屬性域要標識出屬性的具體值,對象之間的關係都是用實線段相連。現在很少將對象圖獨立畫出來,一些CASE工具,如Rational Rose 2002就沒有提供對象圖。對象的概念更多的是用在動態模型圖中。
2.3 構件圖
構件圖描述系統中的構件以及構件之間的依賴關係,構件圖是在很具體的層次描述系統的物理結構。 構件圖有一下幾個主要的模型元素:構件、介面、依賴關係。構件就是定義了良好介面的實現代碼單元,已經成為系統的一部分。構件並不依賴於其他的構件,只依賴於其所支援的介面,因此,構件是可替換的,只要新的替換構件支援相同的介面就可以,構件用一個左邊有兩個小矩形的大矩形表示;介面用於描述構件定義的介面,用一個圓圈表示,它與構件是用實線段相連;依賴關係描述的是構件之間的依賴關係,用帶箭頭的虛線段表示,箭頭一段的是被依賴的構件。
2.4 部署圖
部署圖描述任何基於電腦的應用系統的物理或邏輯的配置。它可以描述系統硬體的物理拓撲結構和在此結構上執行的系統軟體,也能描述系統節點的拓撲結構和通訊路徑、節點上啟動並執行構件、構件中的邏輯單元等。 部署圖中有以下幾個主要的模型元素:節點、構件、對象、介面、串連和依賴關係。節點描述一個物理裝置以及在其上啟動並執行軟體系統,用一個立方體來表示。串連是節點之間的通訊路徑,用實線段來表示。構件、對象、介面和依賴關係同之前的介紹相同。
3. 動態模型圖
動態行為模型圖描述了系統隨時間變化的行為。動態模型圖包括:使用案例圖、狀態圖、活動圖表、順序圖和共同作業圖表。
3.1 使用案例圖
使用案例圖從使用者的角度來描述系統的行為和特徵。使用案例圖一般是用來進行系統的需求分析的工具。 使用案例圖中首先要明確的概念就是用例。用例是系統的一個功能單元,描述了參與者與系統發生的一次互動行為。例如:銀行的ATM自動提款機系統,使用者提款就是一個用例。 使用案例圖有以下幾種模型元素:用例(Use Case)、參與者(Actor)、關聯關係(Association)、內含項目關聯性(Include)、擴充關係(Extend)以及泛化關係(Generalization)。用例是以一個橢圓形來表示,橢圓中心是用例的名稱;參與者就是與所要建模的系統互動的外部使用者、進程或其他系統,參與者是以一個人形的表徵圖表示;關聯關係描述參與者與其需要互動的用例之間的通訊路徑,用一條實線段表示;內含項目關聯性描述一個用例利用另一個用例完成某個過程,用一個帶箭頭的虛線段並在虛線段上以“《include》”作為標識來表示,箭頭指向被包含的用例;擴充關係描述一個用例在原有的另一個用例的基礎上,擴充了那個用例的部分功能,和內含項目關聯性類似,也是以一個帶箭頭的虛線段表示,不同的是虛線段上顯示的是“《extend》”,箭頭指向被擴充的用例;泛化關係描述用例之間的一般和特殊的關係,特殊用例是在繼承了一般用例的特性的基礎上添加了新的特性,泛化關係和擴充關係有相似之處,不同的是擴充關係的需要明確標明被擴充用例的擴充點,擴充用例只能擴充這些擴充點,泛化關係用一個帶有空心三角箭頭的實線段表示。
3.2 狀態圖
狀態圖以狀態的概念描述對象、子系統、系統在生命週期中的各種行為,簡單的說就是一個狀態圖只描述某一個對象(可以是類、程式模組、系統)的行為。通過狀態圖可以知道一個對象、子系統、系統的各種狀態及其收到的訊息對其狀態的影響。世界萬物都有可以描述的狀態,因此都可以通過狀態圖來描述他們的行為,狀態圖具有很強的表達能力。 狀態圖有以下幾種常用的模型元素:狀態(State)、轉換(Transition)、起始狀態(Start State)、終止狀態(End State)。狀態原因一個對象的生命週期中某個時間段的特徵,狀態是用圓角的矩形表示;轉換描述狀態間的轉移,用一個帶箭頭的實線段表示,還可以給轉換添加標註,通過標註來描述引起狀態轉移的事件、條件和要執行的操作,標註的格式為:事件名[條件]/操作,標註的每個部分都可以省略;起始狀態原因對象生命週期的開始階段,用一個黑色的圓表示,有時為了表述清楚,在不產生混淆概念的情況下,可以省去起始狀態;終止狀態原因對象生命週期的終止階段,用一個帶圓形外框的黑色圓表示,一個狀態圖可以有多個終止狀態,有時為了表述清楚,在不產生混淆概念的情況下,可以省去終止狀態。
3.3活動圖表
活動圖表是通過一系列活動描述對象的行為,對象可以是程式、模組、子系統、系統。通過活動圖表,可以瞭解所描述對象的要進行的各種任務和過程。 活動圖表常用的模型元素包括:活動(Activity)、起始點(Start)、終止點(End)、轉換(Transition)、對象(Object)、條件判斷(Decision)、同步條(Synchronization Bar)、資訊流和泳道(Swinlane)。活動描述的是系統要完成的一個任務或要進行的一個過程,是活動圖表中的一個原子活動,活動用一個圓角的矩形表示,並標上活動名;起始點描述活動圖表的開始狀態,與狀態圖類似,用一個黑色的圓標識,活動圖表可以有多個起始點;終止點描述活動圖表的終止狀態,與狀態圖類似,用一個帶圓圈的黑色圓表示,活動圖表可以有多個終止點;轉換描述活動之間的轉換,也就是被描述對象的控制流程,轉換用帶箭頭的實線段表示,箭頭指向轉向的活動,可以在轉換上用文字標識轉換髮生的條件;對象是活動圖表中參與的對象,它可以發送訊號給活動或是接收活動的訊號,也可以表示活動的輸入/輸出結果,對象的表示和對象圖中的表示相同;條件判斷描述活動間轉換的分支,只有一個流入的資訊流,不同的條件下輸出的資訊流有不同的流向,條件判斷用一個菱形表示; 同步條描述活動之間的同步,一般有多個資訊流流入,多個資訊流流出,必須是流入的資訊流都到達,流出的資訊流才能同時流出,同步條用一條較粗的水平的或是垂直的實線段表示;資訊流描述活動和對象的互動關係,對象可以作為活動的輸入/輸出,也可以作為一個實體,接收活動的訊號或是向活動發送訊號,資訊流用帶箭頭的虛線段表示,箭頭標識資訊流的方向;泳道描述的是活動圖表中的活動的分組,通常,可以將活動按照某種標準分組,泳道在UML活動圖表中的表示就是在橫向上將活動圖表劃分出一個縱向的地區,同組的活動和對象都在這個地區中,地區之間用虛線分隔。
3.4 順序圖
順序圖通過描述對象之間的互動來表達被描述對象的行為。順序圖重點強調對象互動的時間性順序性。與前面介紹的模型圖可以隨意組織模型元素不同,順序圖有一定的結構,可以將順序圖看成一個二維座標,縱向上表示的是不同的對象,橫向上是順序的時間 順序圖常用的模型元素有:對象(Object)和訊息(Message)。對象是順序圖描述的對象中的一個子物件,對象的表示和對象圖的類似,但是順序圖中的對象只放置在圖中對象所在的縱向地區的頂端,同時有一條向下延伸的虛線,表示對象的生命線,在對象正在執行動作(如向其它對象發送訊息)的區間,生命線的虛線就被一個矩形方塊代替,用來表示此時對象處於啟用狀態,在物件生命線末尾用一個“×”標識對象生命期的結束;訊息是對象間通訊的資訊,可以是控制資訊、資料資訊等,訊息可以分為簡單訊息、同步訊息、非同步訊息和返回訊息,簡單訊息標識對象間的一般訊息,沒有具體的細節,只描述了對象間的一次通訊,簡單訊息用一個帶箭頭的實線段表示,同步訊息描述的是訊息的發送方發送了訊息之後,必須收到回複訊息才能進行後續的動作,同步訊息用帶實心三角箭頭的實線段表示,非同步訊息描述的是訊息的發送方在發送了訊息之後就能進行後續動作,不需要等待回複訊息,返回訊息描述的是從同步訊息啟用的動作返回到同步訊息寄件者的訊息,返回訊息用帶箭頭的虛線段表示。
3.5 共同作業圖表
共同作業圖表描述在一定的語境中一組對象以及用來實現某些功能的對象之間的相互作用和對象之間的關係。共同作業圖表可以看成是在對象圖的基礎上,加入了對象之間的訊息通訊以描述對象之間的互動。與順序圖不同,共同作業圖表重點是在空間上描述對象的互動。 共同作業圖表除了具有對象圖的模型元素之外,就是加入了訊息(Message),訊息是對象之間的通訊,從而實現對象的互動,訊息可以分為:指向源的簡單訊息、指向目的的簡單訊息、指向源的非同步訊息、指向目的的非同步訊息、指向源的同步訊息、指向目的的同步訊息,指向源和指向目的都是表示簡單訊息的流向,只是圖形表示的指向不同而已,指向源的簡單訊息和指向目的的簡單訊息都用帶箭頭的線段表示,指向源的簡單訊息只指向左邊邊,指向目的的簡單訊息只指向右邊,指向源的非同步訊息用帶有下半個箭頭的實線段表示,指向目的的非同步訊息用帶有上半個箭頭的實線段表示,指向源的同步訊息和指向目的的同步訊息用帶實心三角箭頭的實線段表示,指向源的同步訊息只指向左邊,指向目的的同步訊息只指向右邊。300)this.width=300" border="1">圖 2.2.1 類的表示