【软件系统架构】系列十一:面向对象技术—UML

一、UML(统一建模语言)概述
-
定义:UML 是一种可视化建模语言,而非程序设计语言,支持从需求分析到系统设计的全过程。
-
总体结构:由三部分组成:
-
构造块(Building Blocks):事物(Thing)、关系(Relationship)、图(Diagram)
-
公共机制(Common Mechanisms):实现特定目标的 UML 公共方法
-
规则(Rules):规定构造块如何组合

二、UML 构造块
1.事物(Thing)
-
结构事物:模型的静态部分 -
类(Class)、接口(Interface)、用例(Use Case)、构件(Component) -
行为事物:模型的动态部分 -
交互(Interaction)、活动(Activity)、状态机(State Machine) -
分组事物:组织模型的部分 -
包(Package) -
注释事物:解释模型或约束 -
文本注释、约束条件
说明:
-
使用 包(package) 表示 UML 事物的分类。 -
用 类(class) 表示具体事物。 -
用 箭头关系 表示事物之间的依赖或说明关系。
2.关系(Relationship)
-
依赖(Dependency):一个事物的变化可能影响另一个事物 -
关联(Association):对象之间的结构性连接,可分为: -
聚合(Aggregation):整体与部分关系,较松散 -
组合(Composition):整体与部分关系,更强绑定 -
泛化(Generalization):继承关系,子类 → 父类 -
实现(Realization):类实现接口或契约

说明:
-
关联(Association) 是对象间的结构性连接,聚合/组合 是其特殊类型。 -
泛化(Generalization) 表示继承关系,实现(Realization) 表示接口实现。 -
依赖(Dependency) 表示弱耦合影响,可能作用于关联或泛化。
3.图(Diagram)
-
多个事物及其关系的集合,可分为静态图和动态图。
三、UML 图分类
1. 静态图
类图(Class Diagram):
显示类、接口及其关系

说明:
-
User 是基类,Customer 继承 User(泛化)。 -
Customer 实现了 Payable 接口(实现关系)。 -
Order 与 Product 是组合关系(Composition),整体强绑定。 -
Customer 与 Order 是一般关联(Association)。 -
最后展示了 Product 对另一个 Product 的依赖示例(虚线箭头)。
构件图(Component Diagram):
显示系统构件及其依赖关系

说明:
-
使用 component 定义系统构件。 -
使用箭头表示 依赖关系(哪个构件调用或依赖哪个构件)。 -
可以通过 package 对整个系统进行分组,增强可读性。
部署图(Deployment Diagram):
显示物理节点和构件的分布

说明:
-
使用 node 表示 物理节点(服务器、设备等)。 -
使用 component 表示节点上部署的构件。 -
箭头表示 节点间的通信或依赖。 -
数据库用 database 表示物理存储节点。
对象图(Object Diagram):
类的实例结构

说明:
-
object 表示 类的实例,包含实例属性值。 -
对象间的箭头表示实例之间的关系,例如 拥有 或 包含。 -
可以用对象图直观展示某一时刻系统的对象实例状态和关系。
2. 动态图
序列图(Sequence Diagram)
-
描述对象间按时间顺序的交互 -
消息类型: -
同步消息(实心三角箭头,阻塞调用) -
异步消息(空心箭头,非阻塞) -
返回消息(虚线箭头,从右到左)

说明:
-
同步消息(->):实心箭头,调用方阻塞等待返回。 -
异步消息(->> 或 ++):空心箭头,调用方可继续执行,不阻塞。 -
返回消息(–>):虚线箭头,从被调用对象返回给调用对象。 -
序列图按垂直时间顺序排列,越往下表示时间越晚。
通信图(Communication Diagram)
-
强调对象间交互的组织结构

说明:
-
通信图强调对象之间的 消息传递结构,同时用 编号表示消息顺序。 -
与 序列图不同,通信图更关注 对象之间的关系和交互网络,而不是严格的时间线。 -
可以用这种图快速展示系统中对象间的消息流动及交互层次。
状态图(State Machine Diagram)
-
描述对象在不同状态下的行为 -
包含状态、转换、事件触发器、监护条件

活动图(Activity Diagram)
-
展示系统活动流和并发流程 -
特殊符号: -
并发分岔/汇合线(水平粗线) -
分支、流、监护表达式

说明:
-
start / stop 表示活动图的起点和终点。 -
if (…) then (…) else (…) endif 表示分支,括号内可写 监护条件(guard)。 -
fork / fork again / end fork 表示 并发分岔与汇合。 -
每个 :动作; 表示一个活动。
用例图(Use Case Diagram)
-
描述系统功能及参与者关系

四、UML 5 种视图(4+1视图模型)
1. 逻辑视图(Logical View)
设计模型中类、子系统、包、用例实现的子集
-
目的:面向用户和设计人员,主要体现系统的功能需求。 -
内容: -
系统的关键类(Class)、对象(Object)、接口(Interface) -
子系统划分、包结构(Package Diagram) -
用例实现的映射 -
常用UML图: -
类图(Class Diagram) -
对象图(Object Diagram) -
包图(Package Diagram) -
状态图、活动图(描述对象行为) -
示例:银行系统中的”账户类”、”客户类”、”交易类”,以及它们之间的继承、关联、聚合关系。
2. 进程视图(Process View)
描述线程与进程的并发与同步
-
目的:面向系统集成商和开发人员,关注并发、进程间通信、同步机制。 -
内容: -
线程、进程划分 -
并发机制、通信机制(消息队列、共享内存) -
系统的性能、吞吐量、可伸缩性 -
常用UML图: -
活动图(Activity Diagram,带并发分支/同步) -
时序图(Sequence Diagram) -
通信图(Communication Diagram) -
示例:智能门锁系统中,进程 A(指纹识别)、进程 B(网络通信)、进程 C(日志存储)如何并行并通过消息队列同步。
3. 实现视图(Implementation View)
显示物理代码文件和构件
-
目的:面向程序员,强调代码结构与物理实现。 -
内容: -
源代码文件、库文件、可执行文件 -
模块划分(Java 包结构、C++ 命名空间) -
版本管理与构建方式 -
常用UML图: -
组件图(Component Diagram) -
包图(Package Diagram) -
示例:智能挂锁系统中,auth-service.jar、mqtt-driver.so、ui-app.apk 构件之间的依赖关系。
4. 部署视图(Deployment View)
显示软件与硬件的映射和分布
-
目的:面向运维和架构师,描述软件到硬件的映射。 -
内容: -
硬件节点(服务器、设备、移动端) -
软件组件的部署位置 -
通信协议与网络拓扑 -
常用UML图: -
部署图(Deployment Diagram) -
示例:智能挂锁系统: -
ESP32 设备(运行固件) -
云端 MQTT Broker(运行在阿里云 ECS) -
移动 App(部署在 Android / iOS)
5. 用例视图(Use Case View)
|
|---|
-
目的:面向用户和需求分析人员,体现系统的功能需求和外部交互。 -
内容: -
参与者(Actor) -
系统的用例(Use Case) -
用户与系统的交互场景 -
常用UML图: -
用例图(Use Case Diagram) -
活动图(Activity Diagram,描述场景流程) -
示例:智能挂锁系统: -
参与者:用户、管理员、访客 -
用例:指纹解锁、远程授权、日志查询、一次性密码开锁。
6.4+1 模型关系
(1)关系说明表
用例视图是中心,驱动四大视图,逻辑视图 → 实现视图 → 部署视图 是功能落地的链路,进程视图 → 部署视图 是性能落地的链路。
| 视图 | 面向对象 | 作用 | 与其他视图的关系 |
|---|---|---|---|
| 用例视图 |
|
|
|
| 逻辑视图 |
|
|
|
| 进程视图 |
|
|
|
| 实现视图 |
|
|
|
| 部署视图 |
|
|
|
(2)UML 4+1 视图模型

说明:
-
用例视图:定义需求,贯穿始终(+1)。 -
逻辑视图:功能设计(面向开发)。 -
进程视图:并发性能(面向架构师)。 -
实现视图:代码实现(面向程序员)。 -
部署视图:运行环境(面向运维)。
(3)UML 4+1 视图流程

说明:
-
用例视图 在需求阶段生成,驱动后续所有视图。 -
逻辑视图 和 进程视图 属于系统设计阶段,分别解决功能结构与并发性能。 -
实现视图 对应开发落地,描述代码和构件。 -
部署视图 对应运维阶段,描述运行环境和部署关系。
夜雨聆风