类图和对象图

类图表示不一样的实体(人、事物和数据)如何彼此相关,显示了系统的静态结构。类图可用于表示逻辑类,逻辑类一般就是业务人员所谈及的事物种类,好比摇滚乐队、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;
}
相关文章
相关标签/搜索