類圖和對象圖

類圖表示不一樣的實體(人、事物和數據)如何彼此相關,顯示了系統的靜態結構。類圖可用於表示邏輯類,邏輯類一般就是業務人員所談及的事物種類,好比搖滾樂隊、CD、廣播劇,或者貸款、住房抵押、汽車信貸及利率的抽象描述。類圖還可用於表示實現類,實現類就是程序員要編寫的類。實現類圖與邏輯類圖可能會用來描述一些相同的類。然而,實現類圖與邏輯類圖不會使用相同的描述屬性。
類圖是一個分爲三個部分的矩形。最上面的部分顯示類的名稱,中間部分顯示類的屬性,最下面的部分顯示類的操做(或者說「方法」)。實際上,最經常使用、最簡單的類圖就是一個在裏面顯示了類名的長方形,由於在UML中,大多數類只要有一個可以清楚表達的命名就能夠了。
在類名部分還能夠顯示類的構造類型。類的構造型顯示在一對雙角括符號「« »」之間,常常放在類的名稱上面。常見的構造類型包括實現類(直接顯示類名)、接口(在類名上面顯示 «interface»),以及工具類(在類名上面顯示 «utility»)。若是類名用斜體表示,或者在類名下面標上{abstract},就表示這個類是一個抽象類。
在屬性和方法的前面有一個字符用來表示屬性或方法的做用域,它們的意義以下:
—「-」表示屬性或方法是私有的(private);
—「#」表示屬性或方法是保護的(protected);
—「+」表示屬性或方法是公用的(public)。
緊接在屬性或方法的參數名稱的冒號(:)號以後,顯示了屬性的類型或方法的參數的類型。方法的返回值類型顯示在方法後面的冒號以後。
圖6-3顯示了一個類Person的類圖,它對應的類的C#源代碼以下:
Person
+ name: string
+ sex: char
- age: int
+ Work(in type: string): void
+ Person(in name: string, in sex: char, in age: int): void
+ Speak(): void
+ Eat(): void
圖6-3  類圖示意
class Person
{
    public string name;
    public char sex;
    private int age;
    public Person(string name, char sex, int age)
    {
    }
    public void Eat()
    {
    }
    public void Speak()
    {
    }
    public void Work(string type)
    {
    }
}
對象圖用來表示類的實例化對象。對象圖用一個兩層的矩形來表示,上層標識對象名和類名,下層標識對象的實例化屬性值。下面的代碼將建立一個Person類的對象mary:
Person mary = new Person("Mary", 'F', 24);
對象mary的對象圖如圖6-4所示。
mary: Person
name: string   = "Mary"
sex: char      = 'F'
age: int       = 24
圖6-4  對象圖示例
在一個系統中,類之間存在多種關係,以下所示。
— 繼承(inheritance):繼承是指一個類從其父類派生而來,繼承了父類的屬性和方法。基於類的繼承叫作通常化(generalization),基於接口的繼承,叫作實現(realization)。
— 關聯(association):類之間的關聯大多用來表示變量實例持有對其餘對象的引用,這種關係是半永久的,但沒有包含關係。
— 依賴(dependency):依賴是不一樣類的實例之間的暫時關係。
— 聚合(aggregation):聚合是關聯的一種特殊形式,它意味着一種總體/部分(whole/part)的關係,可是部分也能夠做爲其餘總體的組分,並且部分和總體之間也沒有生命期的依賴。
— 組合(composition):組合是聚合的一種特殊形式,組合的關聯性比聚合更強,部分只能做爲惟一的一個總體的部分,並且部分的生命週期依賴於總體的生命週期。
UML類圖對這些關係的表示方法如圖6-5所示。具備關聯、聚合和組合關係的兩個對象之間多是沒有數量關係的一種聯繫,也可能存在數量關係,好比1對1(不標識)、0個或1個(標識爲0…1)、0個或多個(標識爲0…*或0… n)、1個或多個(標識爲1…*或1… n)或者確切的數字(直接標識數字)。
圖6-6顯示了一個包含了圖6-2中的對象的類圖。其中包括一個繼承關係和兩個關聯關係。CDSalesReport類繼承自Report類。一個CDSalesReport類與一個CD類關聯,可是CD類並不知道關於CDSalesReport類的任何信息。CD類和Band類都彼此知道對方,兩個類彼此均可以與一個或者多個對方類相關聯。
圖6-5  UML類圖之間的關係表示方法
圖6-6  包含關係的類圖
圖6-7顯示了一個包含多種關係的類圖的另外一個例子。Person類實現了IHuman接口,Author類繼承了Person類;Book類與Author類之間的關聯是1對多的,即一本書可能有一個或多個做者;Person讀書,這是一種暫時的單向依賴;Book由一個或多個Page組成,每個Page只能做爲一本Book的一部分,這是一種組合關係;Bookshelf裏能夠不放或者放多本Book,Book也能夠放在其餘的Bookshelf中,Bookshelf的存在並不能影響Book的存在性,這是一種聚合關係。
圖6-7  一個包含多種關係的類圖
表示各對象之間的關係的對象圖說明了系統在某一個特定時刻的狀態,常常叫作系統的快照(snapshot)。
 內幕:UML與源代碼
UML是一種設計語言,它的目的不是表現細節,而是表現結構,僅僅展現必要的細節。所以,UML不可能與源代碼一一對應,只存在結構上的對應關係。做爲一種參考,下面列出了圖6-7中的類圖的C#源代碼:
interface IHuman
{
}
class Person : IHuman
{
    void Read(Book book)
    {
         // …
    }
}
class Author : Person
{
    public Book[] books;
}
class Book
{
    public Author author;
    public Page[] pages;
}
class Page
{
}
class Bookshelf
{
    public Book[] books;
}
相關文章
相關標籤/搜索