004-UML建模基础

难度:🟢 | 预计时间:75分钟 | 前置:003-设计模式分类与结构

学习目标

  • 掌握UML的基本概念和核心图形
  • 学会使用类图表达设计模式的静态结构
  • 掌握时序图描述对象间的动态交互
  • 了解其他UML图在设计模式中的应用
  • 能够阅读和绘制标准的UML图
  • 学会使用Mermaid等工具创建UML图

UML概述

什么是UML

UML(Unified Modeling Language,统一建模语言) 是一种标准化的建模语言,用于软件系统的可视化、规约、构造和文档化。

mindmap
  root((UML))
    结构图
      类图
      对象图
      组件图
      部署图
      包图
      组合结构图
    行为图
      用例图
      活动图
      状态机图
    交互图
      时序图
      通信图
      交互概览图
      时间图

UML在设计模式中的作用

作用 说明 价值
可视化 图形化表达设计思想 提高理解效率
标准化 统一的表达方式 促进团队沟通
抽象化 突出关键结构和关系 聚焦核心问题
文档化 设计决策的记录 便于维护和传承

类图(Class Diagram)

用途:描述系统中类的静态结构以及类之间的关系,是设计模式表达的核心工具。

类的表示法

owns
BankAccount
-accountNumber: String
-balance: double
-owner: Customer
+deposit(amount: double)
+withdraw(amount: double)
+getBalance()
-validateAmount(amount: double)
Customer
-name: String
-id: String
+getName()
+getId()

类的组成部分

部分 说明 示例
类名 类的标识符 BankAccount
属性 类的数据成员 -balance: double
方法 类的行为 +deposit(amount: double): void
可见性 访问控制修饰符 + 公有,- 私有,# 保护,~

类之间的关系

1. 继承关系(Inheritance)
extends
extends
«abstract»
Animal
-name: String
+getName()
+makeSound()
Dog
+makeSound()
+bark()
Cat
+makeSound()
+meow()

特征

  • 使用空心三角箭头
  • 表示"is-a"关系
  • 子类继承父类的属性和方法
2. 实现关系(Realization)
implements
implements
«interface»
Flyable
+fly()
Bird
+fly()
+layEggs()
Airplane
+fly()
+takeOff()

特征

  • 使用虚线空心三角箭头
  • 表示类实现接口
  • 实现类必须提供接口中所有方法的具体实现
3. 关联关系(Association)
teaches
1
*
teaches
1
*
takes
*
*
Teacher
-name: String
+teach()
Student
-name: String
+study()
Course
-courseName: String
+getCourseInfo()

特征

  • 使用实线箭头
  • 表示对象间的结构化关系
  • 可以标注多重性(1, , 0…1, 1…, 等)
4. 聚合关系(Aggregation)
has
Department
-name: String
+addEmployee(emp: Employee)
Employee
-name: String
-id: String
+work()

特征

  • 使用空心菱形
  • 表示"has-a"关系
  • 整体和部分可以独立存在
5. 组合关系(Composition)
contains
House
-address: String
+build()
Room
-roomType: String
-area: double

特征

  • 使用实心菱形
  • 表示强"has-a"关系
  • 整体销毁时,部分也会销毁
6. 依赖关系(Dependency)
uses
uses
OrderService
+processOrder(order: Order)
Order
-orderId: String
-amount: double
EmailService
+sendEmail(message: String)

特征

  • 使用虚线箭头
  • 表示临时的使用关系
  • 通常出现在方法参数、局部变量中

设计模式中的类图示例

策略模式类图
uses
implements
implements
implements
Context
-strategy: Strategy
+setStrategy(strategy: Strategy)
+executeStrategy()
«interface»
Strategy
+execute()
ConcreteStrategyA
+execute()
ConcreteStrategyB
+execute()
ConcreteStrategyC
+execute()

时序图(Sequence Diagram)

用途:描述对象之间按时间顺序进行的交互,展示设计模式的动态行为。

时序图的基本元素

Client Context ConcreteStrategy new Context() setStrategy(strategy) new ConcreteStrategy() executeStrategy() execute() result result Client Context ConcreteStrategy

时序图元素说明

元素 符号 说明
参与者 矩形框 交互中的对象或角色
生命线 垂直虚线 对象的生存时间
激活框 细长矩形 对象处于活跃状态的时间
同步消息 实线箭头 同步方法调用
异步消息 开放箭头 异步方法调用
返回消息 虚线箭头 方法返回
自调用 环形箭头 对象调用自己的方法

观察者模式时序图

Client Subject Observer1 Observer2 attach(observer1) attach(observer2) setState(newState) notifyObservers() update() getState() state update() getState() state Client Subject Observer1 Observer2

其他重要的UML图

用例图(Use Case Diagram)

用途:描述系统功能和用户交互,帮助理解设计模式的应用场景。

flowchart TD
    User((用户))
    Admin((管理员))
    
    subgraph "电商系统"
        UC1[浏览商品]
        UC2[添加到购物车]
        UC3[下单支付]
        UC4[管理商品]
        UC5[处理订单]
    end
    
    User --> UC1
    User --> UC2
    User --> UC3
    Admin --> UC4
    Admin --> UC5
    
    UC3 -.-> UC2 : extends

活动图(Activity Diagram)

用途:描述业务流程或算法流程,展示设计模式中的控制流。

创建
结构
行为
开始
接收请求
请求类型?
创建型模式处理
结构型模式处理
行为型模式处理
执行处理逻辑
返回结果
结束

状态图(State Diagram)

用途:描述对象状态的变化,特别适用于状态模式的表达。

start()
finish()
error()
pause()
resume()
cancel()
reset()
Idle
Processing
Completed
Error
Paused
Cancelled

UML工具和实践

常用UML工具

工具类型 工具名称 特点 适用场景
在线工具 Mermaid 代码化绘图,版本控制友好 文档集成,轻量级建模
专业工具 Enterprise Architect 功能全面,支持代码生成 大型项目,正式建模
免费工具 PlantUML 文本描述,自动布局 快速原型,文档生成
集成工具 Visual Studio IDE集成,代码同步 开发过程中的建模

Mermaid语法快速参考

类图语法
继承
实现
关联
聚合
组合
依赖
ClassName
+attribute: Type
+publicMethod()
-privateMethod()
#protectedMethod()
~packageMethod()
ClassA
ClassB
时序图语法
Alice Bob 同步消息 异步消息 返回消息 自调用 这是一个注释 Alice Bob

设计模式UML实例

工厂方法模式

creates
creates
«abstract»
Creator
+factoryMethod()
+someOperation()
ConcreteCreator
+factoryMethod()
«interface»
Product
+use()
ConcreteProduct
+use()

装饰器模式

«interface»
Component
+operation()
ConcreteComponent
+operation()
«abstract»
Decorator
-component: Component
+operation()
ConcreteDecoratorA
+operation()
+addedBehavior()
ConcreteDecoratorB
+addedState: String
+operation()

命令模式交互

Client Invoker Command Receiver new ConcreteCommand(receiver) setCommand(command) executeCommand() execute() action() result result result Client Invoker Command Receiver

实践练习

练习1:类图绘制

任务:为以下Java代码绘制类图:

// 文件路径: examples/uml/practice/ShapeExample.java
public abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    public abstract double getArea();
    public abstract void draw();
}

public class Circle extends Shape {
    private double radius;
    
    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a " + color + " circle");
    }
}

public class Rectangle extends Shape {
    private double width;
    private double height;
    
    public Rectangle(String color, double width, double height) {
        super(color);
        this.width = width;
        this.height = height;
    }
    
    @Override
    public double getArea() {
        return width * height;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a " + color + " rectangle");
    }
}

验收标准

  • 正确表示类的继承关系
  • 包含所有属性和方法
  • 正确标注可见性
  • 使用Mermaid语法实现

练习2:时序图设计

任务:为单例模式的懒汉式实现绘制时序图,展示多线程环境下的对象创建过程。

验收标准

  • 包含多个线程参与者
  • 展示同步控制机制
  • 正确表示对象创建的时机
  • 包含必要的注释说明

练习3:综合建模

任务:为一个简单的媒体播放器设计UML模型,要求:

  • 支持多种媒体格式(MP3、MP4、AVI)
  • 支持播放控制(播放、暂停、停止)
  • 支持音量控制
  • 使用适配器模式支持不同的解码器

验收标准

  • 绘制完整的类图
  • 绘制关键交互的时序图
  • 绘制播放状态的状态图
  • 说明设计模式的应用

常见问题(FAQ)

Q1: UML图是否需要包含所有细节?

A: 不需要,UML图的详细程度应该根据目的调整:

  • 概念建模:只包含核心概念和关系
  • 设计建模:包含重要的属性和方法
  • 实现建模:包含完整的实现细节

建议

  • 突出重点,省略次要细节
  • 根据受众调整复杂度
  • 保持图的可读性

Q2: 如何选择合适的UML图类型?

A: 根据要表达的内容选择:

要表达的内容 推荐图类型 原因
静态结构 类图 清晰展示类和关系
动态交互 时序图 按时间顺序展示交互
业务流程 活动图 展示流程和决策点
状态变化 状态图 展示状态转换
系统功能 用例图 展示功能和用户

Q3: 手绘UML图还是使用工具?

A: 各有优势,建议结合使用:

手绘优势

  • 快速表达想法
  • 便于讨论和修改
  • 不受工具限制

工具优势

  • 图形标准规范
  • 便于版本控制
  • 支持代码生成
  • 便于分享和维护

建议

  • 初期设计用手绘
  • 正式文档用工具
  • 代码中的文档用Mermaid等轻量级工具

Q4: 如何保持UML图与代码的一致性?

A: 保持一致性的策略:

  1. 工具支持:使用支持代码同步的工具
  2. 文档即代码:将UML图嵌入代码注释或文档
  3. 定期更新:建立定期审查和更新机制
  4. 自动化检查:使用工具检查一致性
  5. 简化图形:只包含核心结构,减少维护成本

总结

UML建模是理解和表达设计模式的重要工具:

核心价值

  • 可视化表达:图形化展示复杂的设计结构
  • 标准化沟通:提供团队间的统一语言
  • 设计验证:通过建模发现设计问题
  • 文档记录:保存设计决策和思路

关键图类型

  • 类图:设计模式的静态结构表达
  • 时序图:对象交互的动态过程展示
  • 状态图:对象状态变化的描述
  • 活动图:业务流程和算法流程

实践建议

  1. 循序渐进:从简单图开始,逐步掌握复杂图
  2. 工具熟练:掌握至少一种UML工具
  3. 标准规范:遵循UML标准,保证图的可读性
  4. 实际应用:在项目中实践,验证理解

注意事项

  • UML是工具,不是目的
  • 图的复杂度要适中
  • 保持图与代码的一致性
  • 根据受众调整详细程度

💡 记住:好的UML图应该能够清晰地传达设计意图,帮助理解而不是增加复杂性。

下一步

掌握了UML建模基础后,我们将学习设计模式的实现技巧,了解如何在实际编程中应用这些理论知识。

参考与引用

更新记录

  • 更新时间: 2024-01-13 | 更新内容: 创建UML建模基础章节,详细介绍类图、时序图等核心UML图 | 更新人: Assistant
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐