![设计模式就该这样学:基于经典框架源码和真实业务场景](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=1739700136-ZHZ2GvuLlJCkA2YqnrCWFSkHH9TJLBPr-0-9935874a3edc5644b5323c57d39d8c3d)
类与类之间的关系(即事物关系)有继承(泛化)关系、实现关系、组合关系、聚合关系、关联关系和依赖关系6种。下面我们来详细分析类关系的具体内容。
2.1.1 继承关系
在继承(Generalization,又叫作泛化)关系中,子类继承父类的所有功能,父类所具有的属性、方法,子类都应该有。除了与父类一致的信息,子类中还包括额外的信息。例如,公交车、出租车和小轿车都是汽车,它们都有名称,并且都能在路上行驶。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_2.jpg?sign=1739700136-sM6DHyLLmq5piOF5ha1NRsyBCrROrbl2-0-5e7c8cfbcbcedbd8704fdfd4d732836f)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_3.jpg?sign=1739700136-oMYEPQxIrikypitfTmydqIvOQInA3IZC-0-e96136dd68af25f9b53e3a212df51cb5)
2.1.2 实现关系
接口(包括抽象类)是方法的集合,在实现(Realization)关系中,类实现了接口,类中的方法实现了接口声明的所有方法。例如,汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_4.jpg?sign=1739700136-SnUttU2QaKk15h6JP97XyJqHsDVC6E2Y-0-65570365fe671fbe14947a75f14f3bc2)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_5.jpg?sign=1739700136-o5pHeSyYLwGLGxLboCyX3sytwW0mrE8t-0-769ff1d53db94422bca93d5decda12dd)
2.1.3 组合关系
组合(Combination)关系表示类之间整体与部分的关系,整体与部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,整体和部分是同生共死的关系。例如,人由头部和身体组成,两者不可分割,共同存在。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_6.jpg?sign=1739700136-WtuOKEX5VEu4oDzddHLILSy9HiN6UnRF-0-5a64703c5658e6f2f072e2f5ae02ad24)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1739700136-kjug0nkP3G40wvNbsXc3YxQxtmuKjEfr-0-61505b983e62548cec59047163709c46)
2.1.4 聚合关系
聚合(Aggregate)关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。例如,公交车司机和工作服、工作帽是整体与部分的关系,但是可以分开,没有共同的生命周期。工作服、工作帽可以穿、戴在别的司机身上,公交车司机也可以换别人的工作服、工作帽。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1739700136-Fm59sIcOA7SfMECkntdWk66SVCgaDFau-0-59068cdca5726105b9f04c584c6f1ddf)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1739700136-AbBNW6QoYKBOvK3L6fHD5QlVAGmpSTEg-0-4efc58210870541e566f3cbf53273908)
2.1.5 关联关系
关联(Association)关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种关系要弱。
关联关系有4种:双向关联、单向关联、自关联、多重性关联。例如汽车和司机,一辆汽车对应特定的司机,一个司机也可以开多辆车。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1739700136-9tiqnFUvFjbULyBdWiVNmlaC2Azm9nvi-0-c2c3eda580ab0d104b9f59907e671a2a)
在多重性关联关系中,可以直接在关联直线上增加一个数字,表示与之对应的另一个类的对象的个数,具体含义如下表所示。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1739700136-kNsEBAiQeCehbuxWNwB91QgS0U2cXUrk-0-a2f87f78600f02a4aaa956a44b3e03c6)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1739700136-tRuPVA87gapgkum7o3pSmdhbDjebHeVr-0-84275fe5d30d0099105e6b1bb54fc921)
2.1.6 依赖关系
依赖(Dependency)关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,当需要表示一个事物使用另一个事物时,使用依赖关系。在大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。例如,汽车依赖汽油,如果没有汽油,则汽车将无法行驶。其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1739700136-wUb3urKvZXSROgEhBuUCL5PuG8OEiOlH-0-8840232ca8ca59f169747a33b35fb54f)
其代码结构如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1739700136-lDP6sUH7PilTYj5wue3CJRn40ZOVZYAu-0-640d69b24bf84951e5476098e87b57a9)
在这6种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解,各类关系从强到弱依次是:继承>实现>组合>聚合>关联>依赖。下面我们用一张完整的类图,将前面描述的所有类与类之间的关系串联起来。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1739700136-yvF46CZMFyMGMgVKZeNRThU2PWBnLQjJ-0-b561a21b626b3ee80ba99bd6261898e1)
UML类图是面向对象设计的辅助工具,但并非是必须工具,所以我们把它作为架构师软技能来讲解。
2.1.7 类关系记忆技巧
类关系记忆技巧总结如下表所示。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1739700136-Z7I50L9hThFbhG3Em1Ihs1TxS1E783X4-0-8b00e036cc3e756788261432efc3703f)
注:UML的标准类关系图中,没有实心箭头(有些Java编程的IDE自带类生成工具可能出现实心箭头,主要目的是降低理解难度)。
下面用一个经典案例来加深和巩固对类图的理解。下图是《大话设计模式》一书中对动物衍生关系描述的类图。这个图非常有技术含量也非常经典,大家可以好好理解一下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1739700136-oGCiW1aPxlIxy5Mzd2pPb6oY3E7lvzFD-0-65fccc9a43eef12dc1adf959eca95e40)