设计模式中的UML基础
目录
1、UML概述
2、UML的用途
3、UML的构成
4、UML图
5、UML类图
5.1、类的构成
5.2、类与类之间的关系
6、绘制UML图的软件工具
在讲解设计模式时,会使用到UML建模中的类图去讲解类与类之间的关系,所以这里需要给大家普及一下UML的相关知识。此外,我们在编写软件设计文档时需要绘制类图、时序图等;我们在学习源码时,可能也需要借助类图去查看分析。
1、UML概述
UML的全称为United Modeling Language,是一种面向对象的可视化建模语言,通过图形符号描述现实系统的组成,通过建立图形之间图的关系来描述整个系统模型。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。在软件开发的流程中,一般先要对软件系统进行规划和建模,把要做的功能、实现的方法、系统内部的业务流程与运行交互机制、要做到什么程度等这些基本问题分析清楚,才去写代码实现。建模是对现实问题按照一定的规则进行抽象与简化,通过建模把现实世界中的问题转化到计算机领域中进行分析和实现,软件建模的过程就是需求-建模-设计的一个过程。
我们在日常工作中会使用UML工具去绘制表示类与类之间关系图的类图、绘制业务实体关系的用例图、绘制业务状态相关的状态图以及绘制与业务流程相关的业务交互时序图等。
2、UML的用途
UML主要用于对软件系统业务流程和内部交互机制进行描述、可视化表述,用来构造和建立软件系统的文档,以方便对系统的理解、设计、浏览、配置、维护和信息控制。通过UML,参与软件的各个生命周期的人员可以方便的沟通交流。
3、UML的构成
UML由模型元素(Model Element)、图(Diagram)、视图(View)和通用机制(General Mechanism)等几个部分组成。
模型元素:代表面向对象中的类、对象、消息和关系等概念,是构成图的最基本的常面向对象系统分析与设计方法用概念。
图:是模型元素集的图形表示,通常是由弧(关系)和顶点(其他模型元素)相互连接构成的。
视图:表达系统的某一方面的特征的UMI,建模元素的子集,由多个图构成,是在某一个抽象层上,对系统的抽象表示。
通用机制:用于表示其他信息,比如注释、模型元素的语义等。另外,UML还提供扩展机制,使UML语言能够适应一个特殊的方法(或过程),或扩充至一个组织或用户。
4、UML图
UML图是对软件系统中面向对象的类、对象、消息和关系等图形化表示,是认识和理解软件系统的关键组成部分。UML图包括用例图、协作图、活动图、时序图、部署图、构件图、类图、状态图。其中,类图和时序图在日常工作中使用的比较多,在介绍设计模式时主要使用类图,所以下面重点介绍一下UML中的类图。
5、UML类图
一个典型的类图如上所示(IM截图模块的类图)。类图是面向对象系统建模中最常用的一种UML图,主要用来表示类与类之间的关系,包括泛化关系、关联关系、依赖关系和实现关系。通过查看类图,我们能快速地搞清楚各个类的关系。我们在阅读软件设计文档或者开源代码时,可能会看到相关的类图,我们要看懂类图,就必须要搞清楚表示类与类的关系连接线类型。
5.1、类的构成
类元素主要由类名、属性和方法三部分构成,如下所示:
- 表示private
- 表示public
表示protected
其中,属性表示为:
属性名:类型
方法表示为:
方法名(参数类型):返回值类型
5.2、类与类之间的关系
1)泛化关系(Generalization)
泛化关系用来表示类与类之间的继承关系,也叫做is a kind of关系,用三角形的箭头从子类指向父类。类图表示如下:
2)实现关系(Realization)
实现关系就是类或接口的实现,由三角箭头虚线从实现类指向接口类,(比如C++中纯虚函数的实现)。类图表示如下:
3)依赖关系(Dependency)
依赖关系是指在一个类中要用到另一个类的实例的一种关系,主要表现为一个类是另一个类的函数参数,或者一个类是另一个类的函数返回值的情况。在类图中的表现形式为一个虚线箭头从一个类指向被依赖的类。类图表示如下:
4)关联关系(Association)
关联关系是类和类之间对应的一种连结,是指两个独立的对象,一个对象的实例与另一个对象的一些特定实例存在固定的对应关系。关联关系可以是单向的也可以是双向的,通过关联使得一个类可以使用另一个类的属性和方法,在C++中具体的表现形式为,一个类的对象是另一个类的成员属性。在类图中,单向的是带箭头的实线,双向的是不带箭头的实线:
5)聚合关系(Aggregation)
聚合关系表示整体和部分的关系,它是一种has-a的包含关系,而且整体和部分是可以分离的,即离开整体,
部分也能存在。聚合关系是关联关系的一种,它是一种更强的关联关系。聚合关系在C++中的表现也是成员
变量的方式,但是和 关联关系不同的是,关联关系中的两个类是相互独立的,而聚合关系中的两个类是整体
与部分的关系,一个类是另一个类的一部分。在类图中,空心菱形在代表整体的类那侧,另一侧为代表部分的类。聚合关系的简单理解,比如手机和充电线,充电线是手机的一部分,手机就是整体,充电线是部分,但是没有手机了,
充电线也可以单独存在,如下:
6)组合关系(Composite)
组合关系也是关联关系的一种,是一种比聚合关系更强的关联关系。如果两个类是聚合关系(A是B的一部分),那么离开B之后,A就失去了存在的意义。组合关系是一种不可分离的关系。在类图中用实心菱形指在代表整体的类,另一侧为代表部分的类。
7)小结
对上述6种类关系的总结:
泛化关系和实现关系的区别:泛化关系是指C++中的继承关系;而实现关系是指虚基类的继承,在子类中实现虚基类的纯虚函数。
泛化关系和实现关系可以看成依赖关系的一种,因为它们离开依赖的类都无法编译通过。
聚合关系和组合关系是关联强度逐渐增强的关联关系;关联关系双方是平等的,聚合关系和组合关系的双方是整体和部分的关系。
聚合关系的双方整体和部分可以分离单独存在,没有生命周期的强相关;组合关系双方,部分离开整体将失去意义,整体的生命周期代表了部分的生命周期。
6、绘制UML图的软件工具
绘制UML图的软件工具比较多,有专业的EA(Enterprise Archtecture)绘制工具,有微软的Visio工具,有韩国的StarUML,还有一些比较新的绘图工具也支持UML绘图,比如亿图软件的图示工具、在线绘图工具drawio等。其中,EA是老牌专业的UML图绘制工具,我比较喜欢用EA。大家可以根据自己的需要和喜好去选择想要的UML工具。