前言
在软考高级中常见的一种题型,对此补充这方面的知识,并将其归入软考的专栏
1. 基本知识
UML(Unified Modeling Language,统一建模语言)图是一种用于描述软件系统结构和行为的图形化语言
- 一种通用的、标准化的建模语言,被广泛应用于软件开发和系统设计领域
- 一种用来描述软件系统结构、行为、交互和非功能属性的图形化表示方法
- 提供了一套统一的符号和规则,帮助软件开发人员、设计师和其他利益相关者进行沟通、交流和理解
其中的作用如下:
- 可视化和沟通: UML图提供了一种可视化的方式来呈现软件系统的各个方面,使得开发人员和利益相关者能够更容易地理解和交流系统设计和功能。
- 设计和分析: UML图可用于系统设计和分析阶段,帮助开发人员捕获系统需求、定义系统架构、识别系统组件之间的关系,并进行模型验证和测试。
- 文档: UML图可以作为软件系统的文档,记录系统的结构、行为和交互,并为后续的系统维护和升级提供参考。
- 自动生成代码: 一些UML建模工具可以根据UML图自动生成部分或全部的代码,从而加速软件开发过程,减少人为错误
理解和区分UML中的结构图、行为图和交互图可以通过它们所关注的内容和展示的方式来进行
- 结构图
关注系统的静态结构,即系统的组件、元素之间的静态关系和属性。它描述了系统中的类、对象、组件、包等元素,以及它们之间的关系,但不涉及元素之间的交互和行为
主要用于展示系统的组织结构和静态特征。
常见的结构图类型:
- 类图(Class Diagram):描述系统中的类、接口、关联、继承等
- 对象图(Object Diagram):展示系统中具体对象的实例及其之间的关系
- 组件图(Component Diagram):显示系统中的组件及其之间的依赖关系
- 部署图(Deployment Diagram):描述系统的物理部署结构
- 包图:描述系统中的各个包(或命名空间)之间的关系和依赖
- 行为图
行为图描述系统中各个组件或对象之间的动态行为
展示了系统的活动流程、状态转换以及对象之间的交互
行为图用于捕获系统在执行过程中的行为和控制流。
常见的行为图类型:
- 用例图(Use Case Diagram):展示系统的功能需求和用户与系统之间的交互
- 活动图(Activity Diagram):描述系统中各个活动之间的流程和控制流
- 状态图(Statechart Diagram):表示系统中对象的状态及状态之间的转换
- 交互图
交互图描述了系统中不同对象之间的交互,以及消息传递的顺序和方式
着重于显示对象之间的通信和协作,用于捕获系统中对象之间的动态交互。
常见的交互图类型:
- 顺序图(Sequence Diagram):展示对象之间的消息交互顺序
- 协作图(Collaboration Diagram):描述对象之间的协作关系
大致区分:
- 结构图关注系统的静态结构,描述了系统的组织结构和静态特征。
- 行为图描述系统中各个组件或对象之间的动态行为,捕获系统在执行过程中的行为和控制流。
- 交互图描述了系统中不同对象之间的交互,着重于显示对象之间的通信和协作。
总的来说,结构图关注系统的组织结构和静态特征,行为图关注系统的动态行为,而交互图关注对象之间的交互和通信
在软件开发过程中,这三种图形式可以互相补充,全面展现系统的各个方面。
2. 结构图
2.1 类图
类图是UML中最常用的结构图之一,它提供了一个视觉化的方式来描述系统中的类及其之间的关系。
涉及到 UML 类图中的不同关系时,每种关系都有其特定的含义和用途。下面是对每种关系的补充和完善:
-
泛化(Generalization),也就是继承
:泛化关系表示类之间的继承关系,其中一个类是另一个类的子类
子类继承了父类的属性和方法,并可以添加新的属性和方法
(泛化关系用空心三角形箭头连接父类和子类,箭头指向父类) -
实现(Realization)
:实现关系表示类实现了接口,即类承诺实现接口中定义的所有方法
(实现关系用带空心三角形的虚线连接类和接口,箭头指向实现的接口) -
依赖(Dependency)
:表示一个类使用另一个类的服务,但不拥有对其的控制权。依赖关系通常是暂时性的,一个类的变化可能会影响到另一个类
(依赖关系用虚线箭头连接两个类,箭头指向被依赖的类) -
关联(Association)
:关联关系表示类之间的连接或关联,一个类知道另一个类的存在,但没有强制的拥有关系
(关联关系通常表示为直线,两端连接有实心箭头,箭头指向被引用的类) -
聚合(Aggregation)
:聚合关系表示整体与部分之间的关系,其中整体对象包含部分对象,但部分对象不是整体对象的一部分
(聚合关系用带空心菱形的直线连接整体和部分,菱形指向整体) -
组合(Composition)
:组合关系也表示整体与部分之间的关系,但是部分对象是整体对象的一部分,没有了整体对象,部分对象也就不存在了
(组合关系用带实心菱形的直线连接整体和部分,菱形指向整体)
详细的补充推荐阅读:UML一一 类图关系 (泛化、实现、依赖、关联、聚合、组合)
强弱顺序
在描述关系的强弱顺序时,通常认为:组合>聚合>关联>依赖
(组合和聚合都是关联关系的一种特例)
- 泛化和实现关系是最强的,因为它们表示类之间的明确的继承和承诺关系(继承和实现)
- 组合关系比聚合关系更强,因为部分对象是整体对象的一部分,整体对象的生命周期影响了部分对象
- 关联关系则比聚合和组合关系更弱,因为它只表示类之间的连接或关联,没有了一个类,并不影响另一个类的存在(通过实例变量体现)
- 依赖关系是最弱的,因为它表示的是一个类对另一个类的临时性使用,一个类的变化可能会影响到另一个类,但不会对其生命周期产生影响(作为方法使用)
2.2 对象图
对象图是 UML 中的一种结构图,用于展示系统中对象的实例及其之间的关系
提供了对类图的实例化表示,更具体地描述了系统中对象的状态和属性,以及对象之间的关联
-
组件(Component):组件图的核心元素,用于表示系统中的可复用的、可替换的软件单元
通常具有清晰的接口和明确的功能,可以被其他组件使用 -
接口(Interface):定义了组件对外提供的服务或功能
描述了组件的操作、方法或消息,其他组件可以通过接口与该组件进行交互 -
依赖关系(Dependency):表示一个组件依赖于另一个组件的服务或功能
如果一个组件使用了另一个组件的服务、接口或功能,则存在依赖关系。依赖关系在组件图中通常用带箭头的虚线表示,箭头指向被依赖的组件。 -
依赖注入(Dependency Injection):一种特殊的依赖关系,用于描述一个组件向另一个组件提供其依赖的实例或对象。依赖注入通常表示为箭头从提供依赖的组件指向接受依赖的组件
示例对象图:这个示例展示了对象图中对象的实例化和关联关系
(在对象图中,实例化了两个对象:Person1 和 Car1,并将它们连接到 PersonCar 类)
+--------------+ +--------------+
| Person | | Car |
+--------------+ +--------------+
| - name: John | | - brand: BMW |
| - age: 30 | | - color: red |
+--------------+ +--------------+
| |
| drives |
v v
+-------------------------------------------+
| PersonCar |
+-------------------------------------------+
| - owner: {Person1} |
| - car: {Car1} |
+-------------------------------------------+
2.3 组件图
在UML中,组件图是一种结构图,用于描述系统中的组件及其之间的依赖关系。组件通常是可以被复用、替换或独立部署的软件单元,它们可以是库、模块、服务、框架等
-
节点(Node):表示系统的物理组件,如服务器、计算机、设备等,用于承载和运行系统的软件组件
-
组件(Component):表示系统的软件组件,如应用程序、库、模块等,需要部署到节点上才能运行
-
连接线(Connector):表示节点之间或节点与组件之间的连接关系,描述了系统中不同组件之间的通信或依赖关系。可以表示网络连接、通信协议、数据传输方式等
-
部署目标(Deployment Target):表示系统被部署到的具体环境或平台,如操作系统、虚拟化环境、云平台等
示例组件图:
- 两个组件:UserManager 和 DatabaseManager,分别表示用户管理和数据库管理功能
- 两个接口:AuthenticationAPI 和 DatabaseAPI,定义了两个组件对外提供的服务
- UserManager 组件依赖于 AuthenticationAPI 接口,而 DatabaseManager 组件依赖于 DatabaseAPI 接口
+-------------------+ +-------------------+
| UserManager | | DatabaseManager |
+-------------------+ +-------------------+
| + login(username,| | + connect() |
| password) | | + executeQuery() |
+-------------------+ +-------------------+
| | ^
| depends on | |
v v |
+------------------------+ +------------------------+
| AuthenticationAPI | | DatabaseAPI |
+------------------------+ +------------------------+
2.4 部署图
描述系统的物理部署结构,即软件系统的部署环境和组件之间的关系
展示了软件系统如何被部署到硬件或软件环境中,包括物理节点、处理器、设备等
示例部署图:
(两个节点:Web Server 和 Database Server,分别表示Web服务器和数据库服务器。每个节点都运行了相应的软件组件,如Apache、PHP、MySQL等。这些节点都部署在虚拟机或物理服务器上,分别由Virtual Machine和Physical Server节点表示。连接线表示了节点之间的部署关系和依赖关系)
+-----------------+ +------------------+
| Web Server | | Database Server|
+-----------------+ +------------------+
| - Apache | | - MySQL |
| - PHP | | - MongoDB |
| - HTML/CSS/JS | +------------------+
+-----------------+ ^
| |
| runs on |
v |
+------------------------+ +-----------------------+
| Virtual Machine | | Physical Server|
+------------------------+ +-----------------------+
| - VMware | | - CPU: Intel Xeon |
| - Ubuntu Server | | - RAM: 32GB |
+------------------------+ | - Storage: 1TB SSD |
+-----------------------+
2.5 包图
包图(Package Diagram)是 UML 中的一种结构图,用于组织和管理系统的模块化设计。它展示了系统中的各个包(或命名空间)之间的层次结构、依赖关系和组织关系
示例包图:
- 三个包:MainPackage、SubPackage 和 UtilityPackage,分别表示主包、子包和工具包,每个包中包含了一些类、接口或子包
- MainPackage 依赖于 SubPackage,因为 MainClass 类使用了 SubClass 类和 SubInterface 接口
- SubPackage 和 UtilityPackage 之间没有依赖关系
+--------------------+ +------------------+
| MainPackage | | SubPackage |
+--------------------+ +------------------+
| - MainClass | | - SubClass |
| - HelperClass | | - SubInterface |
+--------------------+ +------------------+
| ^
| depends on |
v |
+-----------------------------------------+
| UtilityPackage |
+-----------------------------------------+
| - UtilityClass |
| - UtilityInterface |
+-----------------------------------------+
3. 行为图
3.1 用例图
用例图(Use Case Diagram)是UML中的一种行为图,用于描述系统的功能需求和用户与系统之间的交互。它展示了系统的功能模块(用例)以及用户与系统之间的各种使用场景和交互方式
-
用例(Use Case):用例图的核心元素,表示系统的一个功能或一个用户需求
用例描述了系统与用户之间的交互场景和功能流程
通常以椭圆形状表示,用例名称描述了功能的名称或用户需求 -
参与者(Actor):与系统交互的外部实体,可以是用户、外部系统、设备等
参与者可以执行用例,参与到系统的功能中
通常以图标或人的图像表示,位于用例图的边缘 -
包含关系(Inclusion):表示一个用例包含了另一个用例,即一个用例的功能包含了另一个用例的功能
通常表示为虚线箭头,从包含用例指向被包含用例 -
扩展关系(Extension):表示一个用例可以扩展另一个用例的功能,即一个用例的功能可以在另一个用例的基础上进行扩展
通常表示为虚线箭头,从扩展用例指向被扩展的用例 -
泛化关系(Generalization):表示一个用例是另一个用例的特殊情况,即一个用例继承了另一个用例的功能
通常表示为带空心三角形的直线,从子用例指向父用例
或者如下图:(辅助理解,这两张图都来源网络)
3.2 活动图
活动图(Activity Diagram)是UML中的一种行为图,用于描述系统中的业务流程、工作流程或操作流程。它展示了系统中各个活动之间的流程、顺序和条件,以及活动的执行顺序和并发关系
-
活动(Activity):活动图的核心元素,表示系统中的一个操作、任务或业务流程
通常用矩形框表示,框内包含活动的名称,每个活动代表系统中的一个任务或操作 -
起始节点(Initial Node):通常用空心圆圈表示,位于活动图的顶部
-
结束节点(Final Node):通常用实心圆圈表示,位于活动图的底部
-
控制流(Control Flow):表示活动之间的顺序关系,描述了活动之间的执行顺序和流程控制
通常表示为带箭头的直线,箭头指示了活动的执行方向 -
分支和合并(Branch and Merge):用菱形表示,合并用带有多个流出箭头的菱形表示
3.3 状态图
状态图(State Diagram)是UML中的一种行为图,用于描述对象在其生命周期中的各种状态以及状态之间的转换。它展示了对象在不同条件下的行为和状态变化,以及触发状态转换的事件
示例状态图中,从Start状态开始,对象可以发生不同的事件
- 发生Event1事件时,对象从Start状态转换到Processing状态
- 发生Event2事件时,对象从Processing状态转换到Error状态
- 发生Event3事件,对象将从Error状态转换到Finished状态
- 发生Event4事件,对象将从任何状态(包括Processing、Error、Finished)转换到Cancel状态
+-----------------+ [Event1] +-----------------+
| Start | --------------->| Processing |
+-----------------+ +-----------------+
| | | |
| | [Event2] | |
| ------------------->| Error |
| | +-----------------+
| | | |
| | [Event3] | |
| ------------------->| Finished |
+-----------------+ +-----------------+
| | |
| [Event4] | |
------------------->| Cancel |
+-----------------+
结合上面看此图,方便理解:(图源:一步一步学习UML(4)-活动图和状态机图)
4. 行为图
4.1 顺序图
顺序图(Sequence Diagram)是UML中的一种行为图,用于描述对象之间的交互顺序和消息传递。它展示了对象之间的消息交流顺序,包括消息的发送、接收以及时间顺序
-
对象(Object):表示系统中的实体或参与者,可以是类的实例、模块、组件或用户等
对象通常用矩形框表示,框内包含对象的名称 -
生命周期线(Lifeline):表示对象在顺序图中的生存期或活动期间
通常用垂直虚线表示,沿着对象的一侧延伸,表示对象的生命周期。 -
消息(Message):表示对象之间的交互或通信,描述了消息的发送者、接收者以及传递的内容
常用带箭头的直线表示,箭头指示了消息的方向,消息内容位于消息线上方 -
自循环消息(Self-Message):表示对象向自身发送的消息,用于描述对象的自身行为或状态变化
通常从对象的生命周期线上弯曲出一条弧线,再返回到生命周期线上 -
等待消息(Message with Time Constraint):表示对象在接收消息后等待一段时间后才能继续执行的情况,用于描述消息的延迟或等待时间
等待消息通常在消息箭头上方标注时间约束 -
同步消息(Synchronous Message):同步消息通常在消息箭头上方标注同步符号(如实心箭头)
-
异步消息(Asynchronous Message):通常在消息箭头上方标注异步符号(如空心箭头)
-
返回消息(Return Message):通常用虚线箭头表示,箭头指向发送者
图源:UML之顺序图
4.2 协作图
协作图(Collaboration Diagram),也称为通信图(Communication Diagram),是 UML 中的一种行为图,用于描述对象之间的交互和消息传递。它展示了对象之间的通信结构和消息流动,以及对象之间的关系和协作方式
协作图与顺序图中的对象的概念是一样,只不过在协作图中,无法表示对象的创建和撤销,所以对于对象在图中的位置没有限制
图源:15. 面向对象——UML协作图(Collaboration Diagram)