XYZ - 2022年3月
type: channel
link: https://xyzshare.xyz/index.php/2022/03/
description: 真理属于人类，谬误属于时代
items: 如何看懂UML类图

如何看懂UML类图
type: item
date: 2022-03-14T03:20:00+00:00
description: 导语作为程序员，时常在一些技术书中看到这些UML类图表示，大部分能看懂意思，但那些箭头和标记很容易混淆。其实UML类图是一门精准的语言，每个符号都是有着精确的程序语义的，在这篇文章中，通过自己整理的一个例子，举例说明，帮助自己加深理解。UML类图例子其实多看多用就熟悉了，举一个例子，来看这样一幅图，其中就包括了常见UML类图的基本图示法。首先看“交通工具”矩形框，它就代表一个类(Class)。类图分三层，第一层显示类的名称，如果是抽象类，则就用斜体显示。第二层是类的特性，通常就是字段和属性。第三层是类的操作，通常是方法或行为。注意前面的符号，‘+’表示public，‘-’表示private，‘#’表示protected。然后注意左下角的“翻越”，它表示一个接口图，与类图的区别主要是顶端有<<interface>>显示。第一行是接口名称，第二行是接口方法。接口还有另一种表示方法，俗称棒棒糖表示法，比如图中的警车类就是实现了“鸣笛”的接口。interface ICross { // 翻越 void Cross(); } interface IWhistle { // 鸣笛 void Whistle(); } 接下来就可以看下类与类，类与接口之间的关系了。可以观察交通工具、车、轿车、卡车、越野车和警车之间的关系，他们都是继承关系，用空心三角形加上实线来表示。例子中的几种车中，越野车是可以翻越小山丘的，我让它实现了翻越接口，实现接口就用空心三角形加上虚线来表示。、再看卡车和法规（这个例子可能不是特别恰当，但是我想不当更合适的），卡车一般都是运送货物，需要遵守政府的货运相关的法规，限重多少，和卡车能否上路行驶息息相关，卡车司机需要“知道”政府法规，当一个类‘知道’另一个类时，可以用关联（association）。关联关系用实线箭头来表示。越野车队和越野车这两个类，生活中，开越野车的车友喜欢加入俱乐部，参加越野车活动，一个车队可以有多辆车，所以它们之间就满足聚合（Aggregation）关系。聚合表示一种弱的‘拥有’关系，体现的是A对象可以包含B对象，但B对象不是A对象的一部分。聚合关系用空心的菱形+实线箭头来表示。合成（Composition，也有翻译成‘组合’的）是一种强的‘拥有’关系，体现了严格的部分和整体的关系，部分和整体的生命周期一样，在这里车和轮胎就是合成（组合）关系，因为它们是部分和整体的关系，并且轮胎和车的生命周期是相同的。合成关系用实心的菱形+实线箭头来表示。另外，你会注意到合成关系的连线两端还有一个数字‘1’和数字‘2’，这被称为基数。表明这一端的类可以有几个实例，很显然，一辆车应该有5个轮胎（算上备胎）。如果一个类可能有无数个实例，则就用‘n’来表示。关联关系、聚合关系也可以有基数的。交通工具的几大特征，比如类型，路上、水上还是空中的交通工具，交通工具都需要燃料驱动，需要机油保养，他们之间是依赖关系（Dependency），用虚线箭头来表示。abstract class Vehicle { // 增加能源 void Fill(Energy energy); // 保养 void Maintain(EngineOil oil); } 结论编程是一门技术，更加是一门艺术，不能只满足于写完代码运行结果正确就完事，时常考虑如何让代码更加简练，更加容易维护，容易扩展和复用，只有这样才可以真正得到提高。写出优雅的代码真的是一种很爽的事情。UML类图也不是一学就会的，需要有一个慢慢熟练的过程。所谓学无止境，其实这才是理解面向对象的开始呢。