类图中的关系大致一下几种
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)组成要负责创建和删除其部分, 既可以自己创建 / 删除部分, 可以与其他对象协作来创建 / 删除部分. 总之剑在人在, 剑毁人亡.
来源: https://www.cnblogs.com/chengtian/p/8995532.html