UML基礎之關係
UML是統一建模語言([Unifried Modeling Language][6])的縮寫。最初用於描述複雜的軟件和非軟件系統的行爲。UML伴隨着面向對象的概念和方法而生。它本身不是一種編程語言,但通過構建UML圖能夠幫助我們很輕鬆地使用各種語言編寫實際代碼(基本在面嚮對象語言中使用如:java,c++,C#)。
面向對象的一些核心概念:
- 對象
- 類
- 抽象
- 封裝
- 繼承
- 多態
它定義了一種能夠具有多種形式的機制。基本上有兩種類型的多態 性:編譯時(也就是早期綁定)和運行時(後期綁定)。
在編譯時多態性中,對象在編譯時知道要實現多態性。函數重載是在編譯時實現的多態性。編寫重載方法時應該使用相同的名稱和不同的參數。如:對兩個或者三個數字進行加法(sum)運算,而參數的數量由用戶調用時根據需要傳遞,這樣程序員就需要創建2個同樣爲sum的方法,帶有2個或者3個參數。
在運行時多態性中,對象本身不知道在編譯時需要實現多態性,而是在運行時需要實現相應的屬性和方法。是通過對父類函數重寫或者說基於繼承的多態性來實現的。
關係
關係是UML中非常重要的構造塊,顯示元素之間是如何相互關聯的,這種元素之間的聯繫也能反映軟件應用的整體功能。主要包含以下不同種類的關係。(這是我用visio畫的4種關係圖表示:複合即組合)
依賴
依賴關係定義了不同對象之間相互影響的關係。它描述了依賴的對象和依賴關係的方向。
依賴關係描述的主要內容是當兩個元素之中的一個發生變化,另外一個也會相應的發生變化。由如上圖所示虛箭頭表示。關聯
關聯關係描述了UML圖中元素的關聯方式。簡單的說,描述了多少個元素正在參與。關聯關係在類之間通過一個指向關聯方向的箭頭表示。如果兩端都是則是雙向關聯。
//Test與Bar類存在關聯關係
public class Test{
public void doSomething(){
System.out.println(Bar.doSomething());
}
}
//Message類和Person類存在關聯關係
public class Message{
private Person per;
public Message(Person per){
this.per=per;
}
}
依賴關係和關聯關係的區別?
當我們將對某個類的引用作爲當前類特定操作和函數的一部分時,通常會使用依賴關係。使用依賴關係時,你需要意識到依賴關係中會調用引用類中的某個API,而且對引用類的任何修改必然會破壞當前類。依賴關係是由依賴類開始到獨立類的一條虛線箭頭來表示的。在依賴關係中通常沒有多個依賴共存的情況,都是一對一的關係。
關聯關係表示的是一個實例向另一個實例發送消息的能力。這通常由指針或引用實例變量實現。
組合關係是一種特殊的關聯關係類型,代表類之間一種非常強烈的從屬關係。例如上圖,ClassA是整體類,ClassB是A的一部分,使用實心菱形來表示。組合關係描述了類之間的包含關係。
//A類是B,C類的組合
public class A{
private B b;
private C c;
public A(){
this.b=new B();
this.c=new C();
}
//刪除了A,則B,C,也會刪除,因爲是有A構造函數創建的B,C
在聚合關係中,整體類要比部分類起到更重要的作用,但這兩個類不是相互依存的,我們使用空心菱形表示一個簡單的聚合關係。聚合關係描述類之間存在部分和整體的關係。
//A是B和C的聚合
public class A{
private B b;
private C c;
public A(B b,C c){
this.b=b;
this.c=c;
}
}
//如果對A類的刪除並不需要刪除B,C。
比如:一個人有手,腳,心臟等,這就是組合。
一個人有房子,車子,計算機,這就是聚合關係。
- 聚合關係是一種弱關聯,對象能夠彼此進行獨立創建。
- 組合關係是一種強關聯,部分對象在其他對象中創建。
- 在聚合關係中對象可以彼此獨立存在
- 泛化
泛化關係描述了對象世界中的繼承關係,也就是父類與子類的關係。用空心箭頭表示,箭頭指向的一端表示父元素,另一端則表示子元素。 - 擴展
UML圖
主要有兩種基本分類:靜態結構圖與動態行爲圖;
四種靜態結構圖如下:
-類圖
-對象圖
-組件圖
-部署圖
UML具有以下5種類型的動態行爲圖:
-用例圖
-順序圖
-協作圖
-狀態圖
-活動圖