UML類圖

忘記了uml類圖連線之間的關系,記錄一下。

1. 關聯(lián)關系

關聯(lián)(Association)關系是類與類之間最常用的一種關系,它是一種結構化關系,用于表示一類對象與另一類對象之間有聯(lián)系,如汽車和輪胎、師傅和徒弟、班級和學生等等。在UML類圖中,用實線連接有關聯(lián)關系的對象所對應的類,在使用Java、C#和C++等編程語言實現(xiàn)關聯(lián)關系時,通常將一個類的對象作為另一個類的成員變量。在使用類圖表示關聯(lián)關系時可以在關聯(lián)線上標注角色名,一般使用一個表示兩者之間關系的動詞或者名詞表示角色名(有時該名詞為實例對象名),關系的兩端代表兩種不同的角色,因此在一個關聯(lián)關系中可以包含兩個角色名,角色名不是必須的,可以根據(jù)需要增加,其目的是使類之間的關系更加明確。

如在一個登錄界面類LoginForm中包含一個JButton類型的注冊按鈕loginButton,它們之間可以表示為關聯(lián)關系,代碼實現(xiàn)時可以在LoginForm中定義一個名為loginButton的屬性對象,其類型為JButton。如圖1所示:

@實心的箭頭指向被包含的類:指向成員變量

圖1 關聯(lián)關系實例

圖1對應的Java代碼片段如下:

public class LoginForm {

private JButton loginButton; //定義為成員變量

……

}

public class JButton {

……

}

在UML中,關聯(lián)關系通常又包含如下幾種形式:

(1) 雙向關聯(lián)

默認情況下,關聯(lián)是雙向的。例如:顧客(Customer)購買商品(Product)并擁有商品,反之,賣出的商品總有某個顧客與之相關聯(lián)。因此,Customer類和Product類之間具有雙向關聯(lián)關系,如圖2所示:

@實心直線:兩個有關系的類,但是不是包含的關系

圖2 雙向關聯(lián)實例

圖2對應的Java代碼片段如下:

public class Customer {

private Product[] products;

……

}

public class Product {

private Customer customer;

……

}

(2) 單向關聯(lián)

類的關聯(lián)關系也可以是單向的,單向關聯(lián)用帶箭頭的實線表示。例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具有單向關聯(lián)關系,如圖3所示:

@同第一個:箭頭指向被包含的類

圖3 單向關聯(lián)實例

圖3對應的Java代碼片段如下:

public class Customer {

private Address address;

……

}

public class Address {

……

}

(3) 自關聯(lián)

在系統(tǒng)中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯(lián)關系稱為自關聯(lián)。例如:一個節(jié)點類(Node)的成員又是節(jié)點Node類型的對象,如圖4所示:

@比較特殊,自己引用自己

圖4 自關聯(lián)實例

圖4對應的Java代碼片段如下:

public class Node {

private Node subNode;

……

}

(4) 多重性關聯(lián)

多重性關聯(lián)關系又稱為重數(shù)性(Multiplicity)關聯(lián)關系,表示兩個關聯(lián)對象在數(shù)量上的對應關系。在UML中,對象之間的多重性可以直接在關聯(lián)直線上用一個數(shù)字或一個數(shù)字范圍表示。

對象之間可以存在多種多重性關聯(lián)關系,常見的多重性表示方式如表1所示:

表1 多重性表示方式列表

表示方式

多重性說明

1..1

表示另一個類的一個對象只與該類的一個對象有關系

0..*

表示另一個類的一個對象與該類的零個或多個對象有關系

1..*

表示另一個類的一個對象與該類的一個或多個對象有關系

0..1

表示另一個類的一個對象沒有或只與該類的一個對象有關系

m..n

表示另一個類的一個對象與該類最少m,最多n個對象有關系 (m≤n)

例如:一個界面(Form)可以擁有零個或多個按鈕(Button),但是一個按鈕只能屬于一個界面,因此,一個Form類的對象可以與零個或多個Button類的對象相關聯(lián),但一個Button類的對象只能與一個Form類的對象關聯(lián),如圖5所示:

@就是一對多的關系

圖5 多重性關聯(lián)實例

圖5對應的Java代碼片段如下:

public class Form {

private Button[] buttons; //定義一個集合對象

……

}

public class Button {

……

}

(5) 聚合關系

聚合(Aggregation)關系表示整體與部分的關系。在聚合關系中,成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關系用帶空心菱形的直線表示。例如:汽車發(fā)動機(Engine)是汽車(Car)的組成部分,但是汽車發(fā)動機可以獨立存在,因此,汽車和發(fā)動機是聚合關系,如圖6所示:

@左邊是空心菱形,箭頭指向小的一方,左邊由右邊組成,右邊可獨立存在。

圖6 聚合關系實例

在代碼實現(xiàn)聚合關系時,成員對象通常作為構造方法、Setter方法或業(yè)務方法的參數(shù)注入到整體對象中,圖6對應的Java代碼片段如下:

public class Car {

private Engine engine;

//構造注入

public Car(Engine engine) {

this.engine = engine;

}

//設值注入

public void setEngine(Engine engine) {

this.engine = engine;

}

……

}

public class Engine {

……

}

(6) 組合關系

組合(Composition)關系也表示類之間整體和部分的關系,但是在組合關系中整體對象可以控制成員對象的生命周期,一旦整體對象不存在,成員對象也將不存在,成員對象與整體對象之間具有同生共死的關系。在UML中,組合關系用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關系,如圖7所示:

@左邊是實心菱形,箭頭指向被組合類,左邊由右邊組成,右邊不可獨立存在。

圖7 組合關系實例

在代碼實現(xiàn)組合關系時,通常在整體類的構造方法中直接實例化成員類,圖7對應的Java代碼片段如下:

public class Head {

private Mouth mouth;

public Head() {

mouth = new Mouth(); //實例化成員類

}

……

}

public class Mouth {

……

}

2. 依賴關系

依賴(Dependency)關系是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系。大多數(shù)情況下,依賴關系體現(xiàn)在某個類的方法使用另一個類的對象作為參數(shù)。在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。例如:駕駛員開車,在Driver類的drive()方法中將Car類型的對象car作為一個參數(shù)傳遞,以便在drive()方法中能夠調用car的move()方法,且駕駛員的drive()方法依賴車的move()方法,因此類Driver依賴類Car,如圖1所示:

@左邊類依賴右邊類的方法,虛線箭頭指向被依賴的類。

圖1 依賴關系實例

在系統(tǒng)實施階段,依賴關系通常通過三種方式來實現(xiàn),第一種也是最常用的一種方式是如圖1所示的將一個類的對象作為另一個類中方法的參數(shù),第二種方式是在一個類的方法中將另一個類的對象作為其局部變量,第三種方式是在一個類的方法中調用另一個類的靜態(tài)方法。圖1對應的Java代碼片段如下:

public class Driver {

public void drive(Car car) {

car.move();

}

……

}

public class Car {

public void move() {

......

}

……

}

3. 泛化關系

泛化(Generalization)關系也就是繼承關系,用于描述父類與子類之間的關系,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛化關系用帶空心三角形的直線來表示。在代碼實現(xiàn)時,我們使用面向對象的繼承機制來實現(xiàn)泛化關系,如在Java語言中使用extends關鍵字、在C++/C#中使用冒號“:”來實現(xiàn)。例如:Student類和Teacher類都是Person類的子類,Student類和Teacher類繼承了Person類的屬性和方法,Person類的屬性包含姓名(name)和年齡(age),每一個Student和Teacher也都具有這兩個屬性,另外Student類增加了屬性學號(studentNo),Teacher類增加了屬性教師編號(teacherNo),Person類的方法包括行走move()和說話say(),Student類和Teacher類繼承了這兩個方法,而且Student類還新增方法study(),Teacher類還新增方法teach()。如圖2所示:

@父類和子類之間的關系,實線空心三角形指向被繼承的類

圖2 泛化關系實例

圖2對應的Java代碼片段如下:

//父類

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() {

……

}

}

4. 接口與實現(xiàn)關系

在很多面向對象語言中都引入了接口的概念,如Java、C#等,在接口中,通常沒有屬性,而且所有的操作都是抽象的,只有操作的聲明,沒有操作的實現(xiàn)。UML中用與類的表示法類似的方式表示接口,如圖3所示:

圖3 接口的UML圖示

接口之間也可以有與類之間關系類似的繼承關系和依賴關系,但是接口和類之間還存在一種實現(xiàn)(Realization)關系,在這種關系中,類實現(xiàn)了接口,類中的操作實現(xiàn)了接口中所聲明的操作。在UML中,類與接口之間的實現(xiàn)關系用帶空心三角形的虛線來表示。例如:定義了一個交通工具接口Vehicle,包含一個抽象操作move(),在類Ship和類Car中都實現(xiàn)了該move()操作,不過具體的實現(xiàn)細節(jié)將會不一樣,如圖4所示:

@虛線,空心三角形指向被實現(xiàn)的類,接口

圖4 實現(xiàn)關系實例


實現(xiàn)關系在編程實現(xiàn)時,不同的面向對象語言也提供了不同的語法,如在Java語言中使用implements關鍵字,而在C++/C#中使用冒號“:”來實現(xiàn)。圖4對應的Java代碼片段如下:

public interface Vehicle {

public void move();

}

public class Ship implements Vehicle {

public void move() {

……

}

}

public class Car implements Vehicle {

public void move() {

……

}

}

最后總結一下:

關聯(lián)關系

1、雙向關聯(lián)

2、單項關聯(lián)

3、自關聯(lián)

4、多重關聯(lián)

5、聚合關系

6、組合關系

依賴關系

泛化關系

接口與實現(xiàn)關系

引入:http://www.uml.org.cn/oobject/201211231.asp,關系理解,按自己能看的簡化了。

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

相關閱讀更多精彩內容

  • 在UML 2.0的13種圖形中,類圖是使用頻率最高的UML圖之一。Martin Fowler在其著作《UML Di...
    雷雷_zll閱讀 13,507評論 0 14
  • 類圖 是用于描述系統(tǒng)中所包含的類以及它們之間的相互關系,幫助人們簡化對系統(tǒng)的理解,它是系統(tǒng)分析和設計階段的重要產物...
    mesen_liu閱讀 13,134評論 0 7
  • 前言 UML(Unified Modeling Language)中文統(tǒng)一建模語言,是一種開放的方法,用于說明、可...
    Code4Android閱讀 2,655評論 4 67
  • UML類圖是一種結構圖,用于描述一個系統(tǒng)的靜態(tài)結構。類圖以反映類結構和類之間關系為目的,用以描述軟件系統(tǒng)的結構,是...
    司馬東陽閱讀 2,330評論 0 1
  • 第一高能反社會的妖精是誰? 大鵬金翅鳥。 他是比《黑暗騎士》中的小丑更強大的一種生物。 別的妖吃人、殺人,總有一定...
    feec2d177229閱讀 751評論 0 51

友情鏈接更多精彩內容