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