设计模式就该这样学:基于经典框架源码和真实业务场景
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 设计模式常用的UML图

2.1 类图

在UML 2.0的13种图中,类图(Class Diagrams)是使用频率最高的UML图之一。类图描述系统中的类,以及各个类之间的关系的静态视图,能够让我们在正确编写代码之前对系统有一个全面的认识。类图是一种模型类型,确切地说,是一种静态模型类型。类图表示类、接口和它们之间的协作关系,用于系统设计阶段。

类图用3个矩形拼接表示,最上面的部分标识类的名称,中间的部分标识类的属性,最下面的部分标识类的方法,如下图所示。

img

类与类之间的关系(即事物关系)有继承(泛化)关系、实现关系、组合关系、聚合关系、关联关系和依赖关系6种。下面我们来详细分析类关系的具体内容。

2.1.1 继承关系

在继承(Generalization,又叫作泛化)关系中,子类继承父类的所有功能,父类所具有的属性、方法,子类都应该有。除了与父类一致的信息,子类中还包括额外的信息。例如,公交车、出租车和小轿车都是汽车,它们都有名称,并且都能在路上行驶。其类图如下。

img

其代码结构如下。

img

2.1.2 实现关系

接口(包括抽象类)是方法的集合,在实现(Realization)关系中,类实现了接口,类中的方法实现了接口声明的所有方法。例如,汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。其类图如下。

img

其代码结构如下。

img

2.1.3 组合关系

组合(Combination)关系表示类之间整体与部分的关系,整体与部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,整体和部分是同生共死的关系。例如,人由头部和身体组成,两者不可分割,共同存在。其类图如下。

img

其代码结构如下。

img

2.1.4 聚合关系

聚合(Aggregate)关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。例如,公交车司机和工作服、工作帽是整体与部分的关系,但是可以分开,没有共同的生命周期。工作服、工作帽可以穿、戴在别的司机身上,公交车司机也可以换别人的工作服、工作帽。其类图如下。

img

其代码结构如下。

img

2.1.5 关联关系

关联(Association)关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种关系要弱。

关联关系有4种:双向关联、单向关联、自关联、多重性关联。例如汽车和司机,一辆汽车对应特定的司机,一个司机也可以开多辆车。其类图如下。

img

在多重性关联关系中,可以直接在关联直线上增加一个数字,表示与之对应的另一个类的对象的个数,具体含义如下表所示。

img

其代码结构如下。

img

2.1.6 依赖关系

依赖(Dependency)关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,当需要表示一个事物使用另一个事物时,使用依赖关系。在大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。例如,汽车依赖汽油,如果没有汽油,则汽车将无法行驶。其类图如下。

img

其代码结构如下。

img

在这6种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解,各类关系从强到弱依次是:继承>实现>组合>聚合>关联>依赖。下面我们用一张完整的类图,将前面描述的所有类与类之间的关系串联起来。

img

UML类图是面向对象设计的辅助工具,但并非是必须工具,所以我们把它作为架构师软技能来讲解。

2.1.7 类关系记忆技巧

类关系记忆技巧总结如下表所示。

img

注:UML的标准类关系图中,没有实心箭头(有些Java编程的IDE自带类生成工具可能出现实心箭头,主要目的是降低理解难度)。

下面用一个经典案例来加深和巩固对类图的理解。下图是《大话设计模式》一书中对动物衍生关系描述的类图。这个图非常有技术含量也非常经典,大家可以好好理解一下。

img