![设计模式就该这样学:基于经典框架源码和真实业务场景](https://wfqqreader-1252317822.image.myqcloud.com/cover/758/33114758/b_33114758.jpg)
第2章 设计模式常用的UML图
2.1 类图
在UML 2.0的13种图中,类图(Class Diagrams)是使用频率最高的UML图之一。类图描述系统中的类,以及各个类之间的关系的静态视图,能够让我们在正确编写代码之前对系统有一个全面的认识。类图是一种模型类型,确切地说,是一种静态模型类型。类图表示类、接口和它们之间的协作关系,用于系统设计阶段。
类图用3个矩形拼接表示,最上面的部分标识类的名称,中间的部分标识类的属性,最下面的部分标识类的方法,如下图所示。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_1.jpg?sign=1738886447-6zyJErJ4J3boWYQeltD2SGyL9766BGje-0-7646bd53169e7b9fd62c92eb1f61fe9b)
类与类之间的关系(即事物关系)有继承(泛化)关系、实现关系、组合关系、聚合关系、关联关系和依赖关系6种。下面我们来详细分析类关系的具体内容。
2.1.1 继承关系
在继承(Generalization,又叫作泛化)关系中,子类继承父类的所有功能,父类所具有的属性、方法,子类都应该有。除了与父类一致的信息,子类中还包括额外的信息。例如,公交车、出租车和小轿车都是汽车,它们都有名称,并且都能在路上行驶。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_2.jpg?sign=1738886447-8vTNY6CaccGJAMA9relfyXm8Ru5yIHlo-0-186f843e635f1235505ee78abf95a25e)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_3.jpg?sign=1738886447-2lpmzwoJ8rHKxE5xDsodc1RpCYASMjfB-0-69889907a4b7c4342a52dcdb7150324e)
2.1.2 实现关系
接口(包括抽象类)是方法的集合,在实现(Realization)关系中,类实现了接口,类中的方法实现了接口声明的所有方法。例如,汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_4.jpg?sign=1738886447-eai5heDD1npHJQQE6qtZkA8iUFKKNmFn-0-91c772a37f5b466df435b3a74d3effb7)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_5.jpg?sign=1738886447-Hx1d1sTAxxfWh7ypJhXpekDPnKSCAW0F-0-3ba8e9aaa2938122e4483212b1007a80)
2.1.3 组合关系
组合(Combination)关系表示类之间整体与部分的关系,整体与部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,整体和部分是同生共死的关系。例如,人由头部和身体组成,两者不可分割,共同存在。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_6.jpg?sign=1738886447-MEjskjRN1YtBT4M0w2Ipu24NaqXYiKH8-0-150f317fa25d6635d269920b9f34af00)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1738886447-UeQqLzm5FFU05T7OnFuwP398aGMklo73-0-7d4f0d717fb04b72264a8741204dba37)
2.1.4 聚合关系
聚合(Aggregate)关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。例如,公交车司机和工作服、工作帽是整体与部分的关系,但是可以分开,没有共同的生命周期。工作服、工作帽可以穿、戴在别的司机身上,公交车司机也可以换别人的工作服、工作帽。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1738886447-rV8Cx8ri96TbNSId23fymxDEuI4atT8M-0-eb6a79974ec9bb248fdcff7d8c720195)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1738886447-Z8qvIqc0GbG3jvenulK8ygOXNLByR7XM-0-2f3c8f27620e0889efb587a4d105790a)
2.1.5 关联关系
关联(Association)关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种关系要弱。
关联关系有4种:双向关联、单向关联、自关联、多重性关联。例如汽车和司机,一辆汽车对应特定的司机,一个司机也可以开多辆车。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1738886447-tS1O0kTyFfsHRC85OzB8RYTKuXAJYdzq-0-a347c4ae9a9b38ec36c4493d91b21179)
在多重性关联关系中,可以直接在关联直线上增加一个数字,表示与之对应的另一个类的对象的个数,具体含义如下表所示。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1738886447-YMzye5ZuyKS9vIHpW5WuLNJsXprrjLKg-0-bc3227a94d70935327ceddc18c466e80)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1738886447-Es3XKaHf7AAxpmwcuF6FAFVfTcbXFEEq-0-8137a07ec5f88044add55ac429e3f388)
2.1.6 依赖关系
依赖(Dependency)关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,当需要表示一个事物使用另一个事物时,使用依赖关系。在大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。例如,汽车依赖汽油,如果没有汽油,则汽车将无法行驶。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1738886447-PuuXKZqGXpiRRZtAv7td6QWXx6EmCpnu-0-d38d7776dbf9d2a48af565a9b1b049e9)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1738886447-8wWXzYOdmHWWVwuPwXGGB8jnqMNgpqWq-0-60e3594814a3138ac81ac2633a2fa645)
在这6种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解,各类关系从强到弱依次是:继承>实现>组合>聚合>关联>依赖。下面我们用一张完整的类图,将前面描述的所有类与类之间的关系串联起来。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1738886447-Y4diUaIeErezXpFTsVgqh2P2moudACPb-0-b7419b47e7648b01a8327e070f4923f7)
UML类图是面向对象设计的辅助工具,但并非是必须工具,所以我们把它作为架构师软技能来讲解。
2.1.7 类关系记忆技巧
类关系记忆技巧总结如下表所示。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1738886447-1fs6zcDiN4mqJFatZHbztUmwtJMb96Q8-0-ee772cb72accb8d775714410a872671a)
注:UML的标准类关系图中,没有实心箭头(有些Java编程的IDE自带类生成工具可能出现实心箭头,主要目的是降低理解难度)。
下面用一个经典案例来加深和巩固对类图的理解。下图是《大话设计模式》一书中对动物衍生关系描述的类图。这个图非常有技术含量也非常经典,大家可以好好理解一下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1738886447-TkOlVyFgsGiDbBNRJPF9ECSIsL0QUNHh-0-5fa2b2c9e4e9c887db69dea0e4e71f05)