2022年3月

导语

作为程序员,时常在一些技术书中看到这些UML类图表示,大部分能看懂意思,但那些箭头和标记很容易混淆。其实UML类图是一门精准的语言,每个符号都是有着精确的程序语义的,在这篇文章中,通过自己整理的一个例子,举例说明,帮助自己加深理解。

UML类图例子

其实多看多用就熟悉了,举一个例子,来看这样一幅图,其中就包括了常见UML类图的基本图示法。
UML类图.png
首先看“交通工具”矩形框,它就代表一个类(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类图也不是一学就会的,需要有一个慢慢熟练的过程。所谓学无止境,其实这才是理解面向对象的开始呢。