類圖中的關系大致一下幾種
l 泛化
l 關聯
l 依賴
l 組合
l 聚合
泛化
泛化是子集和超集的關系,常使用繼承和實現來表示;
繼承:子類到超類的實線和空心三角箭頭表示
實現:子類到超類的虛線和空心三角箭頭表示
依賴
依賴常常表示 一方(客戶)知道另一方(提供者)並且另一方(提供者)有所改變時會對一方(客戶)產生影響。這就是常常說的耦合。
依賴有許多種類型,比較常見的類型;
擁有提供者類型的參數
接收提供者類型的參數
提供者是超類或接口
向提供者發送消息。對提供者的可見性可能是 屬性,參數變量,局部變量,全局變量或類方法。
public class Client { /// <summary> /// 1.UpdatePrintMsg 方法接收Supplier對象作為參數,然后向其發送GetPrintMsg消息 /// 由此可見 client對象對supper具有參數可見性,並且有發送消息的耦合,因此對supplier有依賴。 /// 如果后者發生變化,client類將會受到影響。 /// </summary> /// <param name="supplier"></param> public void UpdatePrintMsg(Supplier supplier) { var msg = supplier.GetPrintMsg(); Console.WriteLine("客戶端:call-》"+ msg); } } public class Supplier { public string Msg => "提供者信息"; public string GetPrintMsg() { return Msg; } }
客戶端調用並輸出 :客戶端: call-》提供者信息
Client client = new Client(); client.UpdatePrintMsg(new Supplier());
在看另外一個例子
public class Client { /// <summary> /// PrintCartNum方法調用了supplier的靜態方法。因此client對象對suplier類 /// 具有靜態方法依賴。 /// </summary> public void PrintCartNum() { long cartNum = Supplier.GetCartId(); Console.WriteLine(cartNum); } } public class Supplier { public static long GetCartId() => 1000_2000_3000_4000; }
客戶端調用並輸出:1000200030004000
Client client = new Client(); client.PrintCartNum();
關聯
關聯是一種has a 的關系,用導航性箭頭(即實線+箭頭)由源對象(order)那個指向目標對象(OrderItem),表示Order的一個屬性是orderItem對象。在具體的實現時往往表示為類的屬性
關聯也可以不帶箭頭表示雙向關聯
聚合
聚合是uml中一種模糊的關聯,其不精確地暗示了整體-部分關系(和許多普通關聯一樣)
為什么還定義這一術語呢?參考uml創始人之一的話:“雖然並沒有給聚合賦予太多的語義,但是每個人都認為這是必要的。可以將其視為建模的安慰劑。”因此,聽從uml創始者的建議,不要費心去使用聚合。相反,在適當的時候要使用組合。
組合
組合也稱為組合聚合,這是一種很強的整體-部分聚合關系,並且在某些模型中具有效用。總是暗示“擁有-部分”的某系變體。使用實心菱形箭頭表示組合。
組合關系有一下幾層含義:1)在某一時刻,部分的實例只能屬於一個組成實例。
2)部分必須總是屬於組成;3)組成要負責創建和刪除其部分,既可以自己創建/刪除部分,可以與其他對象協作來創建/刪除部分。總之劍在人在,劍毀人亡。