類
一般矩形框代表類,類圖分為三層,第一層顯示類的名稱,如果是抽象類,則就用斜體顯示,如果是接口,則使用<<interface>>
;第二層是類的特性,通常就是字段和屬性;第三層是類的操作,通常是方法或行為 。
注 意 前 面 的 符 號 , ‘+’ 表 示 public , ‘-’ 表 示 private , ‘#’ 表 示
protected。
有時候,如果是接口,uml類圖中的矩形框在名字前面有I
標識或者<<interface>>
標識,
而普通的class一般是C
標識,抽象類是A
標識。這些屬于看到明白什么意思就行。
具體來說:
<<interface>>
是UML中表示接口的標準圖形符號。
名稱使用斜體是UML中表示抽象類的標準圖形符號。
I、A、C作為前綴是編程實踐中的命名約定,而不是UML本身的圖形符號規范。
普通類
抽象類
接口
關系
繼承關系
繼承關系用空心三角形+實線表示
實現接口
實現接口用空心三角形+虛線來表示
關聯關系
用實線箭頭來表示
聚合關系
聚合關系用空心的菱形+實線箭頭來表示
聚合表示一種弱的’擁有’關系,體現的是A對象可以包含B對象,但B對象不是A對象的一部分。具體來說,就是A 類擁有 B 類對象,但 B 類對象可以脫離 A 類獨立存在;同時他們的生命周期是分離的。注意:這個生命周期分離區別組合。
例如:大雁與雁群這兩個類,大雁是群居動物,每只大雁都屬于一個雁群,一個雁群可以有多只大雁。所以它們之間就滿足聚合(Aggregation)關系
// 大雁類
public class Goose {private String name;public Goose(String name) {this.name = name;}public void fly() {System.out.println(name + " 正在飛行...");}public String getName() {return name;}
}
import java.util.List;public class GooseGroup {private List<Goose> geese;public GooseGroup(List<Goose> geese) {this.geese = geese;}public void groupFly() {System.out.println("雁群開始集體飛行:");for (Goose goose : geese) {goose.fly();}}
}
import java.util.Arrays;public class Main {public static void main(String[] args) {Goose g1 = new Goose("大雁A");Goose g2 = new Goose("大雁B");// Goose 對象可以獨立創建GooseGroup group = new GooseGroup(Arrays.asList(g1, g2));// 雁群中可以調用大雁的方法group.groupFly();// 即使雁群銷毀,大雁也可以繼續存在g1.fly(); // 單獨飛行}
}
這里的特征是:
Goose 可獨立創建/存在
GooseGroup 包含 Goose 列表
Goose 生命周期不依賴 GooseGroup
組合/合成 Composition
合成(Composition,也有翻譯成’組合’的)是一種強的’擁有’關系,體現了嚴格的部分和整體的關系,部分和整體的生命周期一樣。他們的生命周期是相同的。通常在構造器中創建子對象,并負責其生命周期。這個區別于聚合的一般是引用對象,不負責銷毀和創建。
合成關系用實心的菱形+實線箭頭來表示。另外,合成關系的連線兩端還有一個數字’1’和數字’2’,這被稱為基數。表明這一端的類可以有幾個實例
以鳥類來舉例,就是一個鳥有兩個翅膀。當然如果一個類有n個實例,可以用n表示。
依賴關系
注意UML圖中的依賴關系區別于面向對象中的依賴。UML中的依賴關系是一種建模層面的、寬泛的“使用”關系,而OOP中的依賴更關注在實現代碼中的耦合方式。