架構(gòu)師之路2 UML圖之類圖

架構(gòu)師之路 目錄

前言

1.類(Class)封裝了數(shù)據(jù)和行為,是面向?qū)ο蟮闹匾M成部分,它是具有相同屬性、操作、關(guān)系的對象集合的總稱。
2. 在系統(tǒng)中,每個類具有一定的職責(zé),職責(zé)指的是類所擔(dān)任的任務(wù),即類要完成什么樣的功能,要承擔(dān)什么樣的義務(wù)。一個類可以有多種職責(zé),設(shè)計得好的類一般只有一種職責(zé),在定義類的時候,將類的職責(zé)分解成為類的屬性和操作(即方法)。
3. 類的屬性即類的數(shù)據(jù)職責(zé),類的操作即類的行為職責(zé)

在UML類圖中,常見的有以下幾種關(guān)系: 泛化(Generalization), 實現(xiàn)(Realization, 關(guān)聯(lián)(Association), 聚合(Aggregation), 組合(Composition), 依賴(Dependency)

1、依賴關(guān)系(Dependence)

依賴關(guān)系(Dependence):假設(shè)A類的變化引起了B類的變化,則說名B類依賴于A類。

? 依賴關(guān)系(Dependency) 是一種使用關(guān)系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關(guān)系。大多數(shù)情況下,依 賴關(guān)系體現(xiàn)在某個類的方法使用另一個類的對象作為參數(shù)。

? 在UML中,依賴關(guān)系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。

依賴關(guān)系
public class Driver
{
    public void drive(Car car)
    {
        car.move();
    }
    ……
}
public class Car
{
    public void move()
    {
        ......
    }
    ……
}

依賴關(guān)系有如下三種情況:

1、A類是B類中的(某中方法的)局部變量;

2、A類是B類方法當(dāng)中的一個參數(shù);

3、A類向B類發(fā)送消息,從而影響B(tài)類發(fā)生變化;

2、泛化關(guān)系(Generalization)

泛化關(guān)系(Generalization):A是B和C的父類,B,C具有公共類(父類)A,說明A是B,C的一般化(概括,也稱泛化)

? 泛化關(guān)系(Generalization)也就是繼承關(guān)系,也稱為“is-a-kind-of”關(guān)系,泛化關(guān)系用于描述父類與子類之間的關(guān)系,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛 化關(guān)系用帶空心三角形的直線來表示。

? 在代碼實現(xiàn)時,使用面向?qū)ο蟮睦^承機(jī)制來實現(xiàn)泛化關(guān)系,如在Java語言中使用extends關(guān)鍵字、在C++/C#中使用冒號“:”來實現(xiàn)。

泛化關(guān)系
注意:“ + ” 表示public, “ # ”表示protected, “ - ”表示private
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() 
    {
        ……
    }
}


在UML當(dāng)中,對泛化關(guān)系有三個要求:

1、子類與父類應(yīng)該完全一致,父類所具有的屬性、操作,子類應(yīng)該都有;

2、子類中除了與父類一致的信息以外,還包括額外的信息;

3、可以使用父類的實例的地方,也可以使用子類的實例;

3、關(guān)聯(lián)關(guān)系(Association)

關(guān)聯(lián)關(guān)系(Association):類之間的聯(lián)系,如客戶和訂單,每個訂單對應(yīng)特定的客戶,每個客戶對應(yīng)一些特定的訂單,再如籃球隊員與球隊之間的關(guān)聯(lián)(下圖所示)。

關(guān)聯(lián)關(guān)系

其中,關(guān)聯(lián)兩邊的"employee"和“employer”標(biāo)示了兩者之間的關(guān)系,而數(shù)字表示兩者的關(guān)系的限制,是關(guān)聯(lián)兩者之間的多重性。通常有“ * ”(表示所有,不限),“ 1 ”(表示有且僅有一個),“ 0... ”(表示0個或者多個),“ 0,1 ”(表示0個或者一個),“ n...m ”(表示n到m個都可以),“ m...* ”(表示至少m個)。

? 關(guān)聯(lián)關(guān)系(Association) 是類與類之間最常用的一種關(guān)系,它是一種結(jié)構(gòu)化關(guān)系,用于表示一類對象與另一類對象之間有聯(lián)系。

? 在UML類圖中,用實線連接有關(guān)聯(lián)的對象所對應(yīng)的類,在使用Java、C#和C++等編程語言實現(xiàn)關(guān)聯(lián)關(guān)系時,通常將一個類的對象作為另一個類的屬性。

? 在使用類圖表示關(guān)聯(lián)關(guān)系時可以在關(guān)聯(lián)線上標(biāo)注角色名。

1) 雙向關(guān)聯(lián): 默認(rèn)情況下,關(guān)聯(lián)是雙向的。

雙向關(guān)聯(lián)
public class Customer
{
    private Product[] products;
    ……
}
public class Product
{
    private Customer customer;
    ……
}

2 ) 單向關(guān)聯(lián):類的關(guān)聯(lián)關(guān)系也可以是單向的,單向關(guān)聯(lián)用帶箭頭的實線表示.

單向關(guān)聯(lián)
public class Customer
{
    private Address address;
    ……
}
 
public class Address
{
    ……
}

3) 自關(guān)聯(lián): 在系統(tǒng)中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關(guān)聯(lián)關(guān)系稱為自關(guān)聯(lián)。

Node
public class Node
{
    private Node nextNode;
    ……
} 

4) ****重數(shù)性關(guān)聯(lián): 重數(shù)性關(guān)聯(lián)關(guān)系又稱為多重性關(guān)聯(lián)關(guān)系(Multiplicity),表示一個類的對象與另一個類的對象連接的個數(shù)。在UML中多重性關(guān)系可以直接在關(guān)聯(lián)直線上增加一個數(shù)字表示與之對應(yīng)的另一個類的對象的個數(shù)。

表示方式 多重性說明
1..1 表示另一個類的一個對象只與一個該類對象有關(guān)系
0..* 表示另一個類的一個對象與零個或多個該類對象有關(guān)系
1..* 表示另一個類的一個對象與一個或多個該類對象有關(guān)系
0..1 表示另一個類的一個對象沒有或只與一個該類對象有關(guān)系
m..n 表示另一個類的一個對象與最少m、最多n個該類對象有關(guān)系 (m<=n)
重數(shù)性關(guān)聯(lián)
public class Form
{
    private Button buttons[];
    ……
} 
public class Button
{
    …

4、聚合關(guān)系(Aggregation)

聚合關(guān)系(Aggregation):表示的是整體和部分的關(guān)系,整體與部分 可以分開.

? 聚合關(guān)系(Aggregation) 表示一個整體與部分的關(guān)系。通常在定義一個整體類后,再去分析這個整體類的組成結(jié)構(gòu),從而找出一些成員類,該整體類和成員類之間就形成了聚合 關(guān)系。

? 在聚合關(guān)系中,成員類是整體類的一部分,即成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關(guān)系用帶空心菱形的直線表示。

聚合關(guān)系
public class Car
{
    private Engine engine;
    public Car(Engine engine)
   {
        this.engine = engine;
    }
    
    public void setEngine(Engine engine)
    {
        this.engine = engine;
    }
    ……
}
public class Engine
{
    ……
}

如:電腦包括鍵盤、顯示器,一臺電腦可以和多個鍵盤、多個顯示器搭配,確定鍵盤和顯示器是可以和主機(jī)分開的,主機(jī)可以選擇其他的鍵盤、顯示器組成電腦;

5、組合關(guān)系(Composition)

組合關(guān)系(Composition):也是整體與部分的關(guān)系,但是整體與部分不可以分開.

? 組合關(guān)系(Composition)也表示類之間整體和部分的關(guān)系,但是組合關(guān)系中部分和整體具有統(tǒng)一的生存期。一旦整體對象不存在,部分對象也將不存在,部分對象與整體對象之 間具有同生共死的關(guān)系。

? 在組合關(guān)系中,成員類是整體類的一部分,而且整體類可以控制成員類的生命周期,即成員類的存在依賴于整體類。在UML中,組合關(guān)系用帶實心菱形的直線表示。

組合關(guān)系
public class Head
{
    private Mouth mouth;
    public Head()
    {
    mouth = new Mouth();
    }
    ……
}
 
public class Mouth
{
    ……
}

6、實現(xiàn)關(guān)系(Implementation)

實現(xiàn)關(guān)系(Implementation):是用來規(guī)定接口和實線接口的類或者構(gòu)建結(jié)構(gòu)的關(guān)系,接口是操作的集合,而這些操作就用于規(guī)定類或者構(gòu)建的一種服務(wù)。

? 接口之間也可以有與類之間關(guān)系類似的繼承關(guān)系和依賴關(guān)系,但是接口和類之間還存在一種實現(xiàn)關(guān)系(Realization),在這種關(guān)系中,類實現(xiàn)了接口,類中的操作實現(xiàn)了接口中所 聲明的操作。在UML中,類與接口之間的實現(xiàn)關(guān)系用帶空心三角形的虛線來表示。

實現(xiàn)關(guān)系
public interface Vehicle 
{
    public void move();
}
public class Ship implements Vehicle
{
    public void move() 
    {
    ……
    }
}
public class Car implements Vehicle
{
    public void move() 
    {
    ……
    }
}

特別感謝

真實的歸宿

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容