類圖是描述類與類之間關系的示意圖,它形象的描述了系統的結構,有助于與更深刻的理解軟件的設計思想。
類圖中類的關系由強到弱可以分為4種:泛化 ---> 實現 ---> 關聯 ---> 依賴。
1. 泛化
關系說明:泛化是一種繼承。它指定了子類如何特化父類的所有特征和行為。
代碼說明:父類與子類
圖例:空心三角形的實線箭頭,箭頭指向父類
代碼:
public class Base{
}
public class BaseExt extends Base{
}
2. 實現
關系說明:實現是一種類與接口的關系,表示類是接口所有特征和行為的實現。
代碼說明:實現類和接口
圖例:空心三角形虛線箭頭,箭頭指向接口
代碼:
public interface IBase{
public void doSomething();
}
public class BaseImp implements IBase{
@Override
public void doSomething(){
System.out.println("doSomething!");
}
}
3. 關聯
關系說明:關聯表示類與類之間的擁有關系。即一個類是另一個類的成員。
關聯的種類:自關聯、單向關聯、雙向關聯、多重關聯、聚合、組合等
3.1 自關聯
關系說明:一個類包含自己。
代碼說明:成員變量
圖例:普通實線箭頭指向自己
代碼:
public class Node {
private Node node;
}
3.2 單向關聯
關系說明:一個類包含另一個類的成員,另一個類沒有該類的成員
代碼說明:成員變量
圖例:普通實線箭頭指向被關聯的類
代碼:
public class NodeA{
}
public class NodeB{
private NodeA nodeA;
}
3.3 雙向關聯
關系說明: 兩個類互相包含另一個類的成員。(容易循環引用,造成內存泄漏)
代碼說明:成員變量
圖例:普通實線,不帶箭頭
代碼:
public class NodeA{
private NodeB nodeB;
}
public class NodeB{
private NodeA nodeA;
}
3.4 多重關聯
關系說明:一個類中包含另一個類的多個成員。
代碼說明:成員變量
圖例:帶數量關系說明的實線,不帶箭頭。
代碼:
public class NodeA{
}
public class NodeB{
private NodeA[] nodeAs;
}
3.5 聚合
關系說明:聚合是整體與部分的關系,成員對象是整個對象的一部分,成員對象的可以獨立存在。如:輪胎和汽車關系
代碼說明:成員變量
圖例:帶空心菱形的實線箭頭,菱形指向整體,箭頭指向部分。
代碼:
public class Car{
public Tire tire;
}
public class Tire{
}
3.6 組合
關系說明:組合是整體與部分的關系,成員對象是整體的一部分,整體對象控制著成員對象的生命周期,一旦整體不存在,成員對象也不存在。如:人的身體和手
代碼說明:成員變量
圖例:帶實心菱形的實線箭頭,菱形指向整體,箭頭指向部分
代碼:
public class Body{
private Hand hand;
}
public class Hand{
}
4. 依賴
關系說明:依賴表示類與類之間的使用關系。表示一個事物使用另一個事物。
代碼說明:局部變量、方法的參數或者對靜態方法、成員的調用
圖例:帶箭頭的虛線,指向被使用者
代碼:
public class Boat{
}
public class People{
public int acrossRiver(Boat boat){
.........
}
}
5. 總結
對類圖關系的理解,可以幫助更好的理解設計模式的精髓。后面筆者將逐步介紹幾種常見的設計模式。