427 lines
16 KiB
Markdown
427 lines
16 KiB
Markdown
# 第7章 组件图与部署图
|
||
|
||
> **考试重要度**:★★★
|
||
> **核心内容**:组件的概念与类型、组件与类的关系、正向工程与逆向工程、部署图与结点
|
||
|
||
---
|
||
|
||
## 📢 从盖房子理解物理模型
|
||
|
||
💬 前面学的用例图、类图、顺序图等是**逻辑模型**——描述"软件能干什么"和"软件怎么组织"。
|
||
|
||
组件图和部署图是**物理模型**——描述"软件代码文件怎么组织"和"软件部署在哪台机器上"。
|
||
|
||
```
|
||
逻辑模型:用例图 + 类图 + 顺序图 + 协作图 + 活动图 + 状态图
|
||
物理模型:包图 + 组件图 + 部署图
|
||
```
|
||
|
||
💬 **比喻**:逻辑模型是"建筑设计图"(几室几厅、什么风格),物理模型是"施工方案"(每间房用什么材料、电线怎么走)。
|
||
|
||
---
|
||
|
||
## 💡 一、组件的概念
|
||
|
||
> **定义**:组件 = 系统中可替换的物理部件,是一个实现性文件。
|
||
|
||
💬 **大白话**:组件就是"软插件"——像电脑的USB设备一样,可以拔下来换一个。
|
||
|
||
### 组件的三种类型
|
||
|
||
| 类型 | 说明 | 举例 |
|
||
|------|------|------|
|
||
| **部署组件** | 运行时需要的组件 | DLL文件、JAR文件、数据库表、XML文件 |
|
||
| **工作产品组件** | 开发过程产生的组件 | 源代码文件(.java/.cpp)、数据文件 |
|
||
| **执行组件** | 运行后产生的组件 | EXE文件、动态网页、EJB |
|
||
|
||
---
|
||
|
||
## 💡 二、组件和类的关系
|
||
|
||
🔑 **这是本章最重要的理解!**
|
||
|
||
| 维度 | 类 | 组件 |
|
||
|------|-----|------|
|
||
| **性质** | 逻辑概念("虚") | 物理概念("实") |
|
||
| **存在形式** | 设计图上的符号 | 硬盘上的文件 |
|
||
| **包含关系** | 一个类只在一个组件中 | 一个组件可以包含多个类 |
|
||
| **例子** | `class BankAccount` | `BankAccount.java` 这个文件 |
|
||
|
||
💬 **简单说**:一个.java文件可以定义多个类,这个.java文件就是**组件**,里面的class定义就是**类**。
|
||
|
||
### 组件之间的关系
|
||
|
||
组件之间的关系 = 包含的类之间的关系的"投影"。
|
||
|
||
> 类A依赖于类B → 组件A依赖于组件B
|
||
|
||
---
|
||
|
||
## 💡 三、正向工程与逆向工程
|
||
|
||
| 工程方向 | 含义 | 过程 |
|
||
|----------|------|------|
|
||
| **正向工程** | 模型 → 代码 | 画好类图和组件图 → 工具自动生成代码框架 |
|
||
| **逆向工程** | 代码 → 模型 | 导入源代码 → 工具自动生成类图和组件图 |
|
||
|
||
💬 **正向工程**:先设计,再生成代码骨架。
|
||
💬 **逆向工程**:拿到别人写的代码,自动生成类图来理解结构。
|
||
|
||
---
|
||
|
||
## 💡 四、部署图
|
||
|
||
### 结点的概念
|
||
|
||
> **结点** = 运行时存在的、有计算能力的物理元素。
|
||
|
||
| 结点类型 | 说明 | 举例 |
|
||
|----------|------|------|
|
||
| **处理机结点** | 有计算能力的硬件 | PC机、服务器、打印机(智能) |
|
||
| **设备结点** | 无计算能力的硬件 | 调制解调器、普通终端 |
|
||
|
||
### 部署图的作用
|
||
|
||
部署图显示:
|
||
1. 系统中有哪些**硬件结点**
|
||
2. 结点之间的**连接关系**(通信路径)
|
||
3. 每个结点上运行什么**组件**
|
||
|
||
💬 **一句话**:部署图 = "哪个软件组件跑在哪台机器上"。
|
||
|
||
---
|
||
|
||
## 📌 附录:组件图与部署图常用画图符号速查
|
||
|
||
> 这一节把组件图、部署图里所有的画图元素(组件、接口、结点、关系)用字符画列出来。
|
||
|
||
### 1. 组件(Component)—— 矩形 + 左侧两个小矩形
|
||
|
||
```
|
||
┌────┐
|
||
├────┤ ┌─────────────────┐
|
||
└────┘ │ <<component>> │ ← 字符画示意
|
||
│ OrderService │ ← 实际画法(两个小矩形贴在
|
||
└─────────────────┘ 组件图标的左上角)
|
||
```
|
||
|
||
更形象的字符画(标准画法的样子):
|
||
|
||
```
|
||
┌────────────────────────┐
|
||
│ ╔══════════════╗ │
|
||
╔═╧═╗║ OrderService ║ │ ← 左侧两个小方块
|
||
║ ║╚══════════════╝ │ 右侧大矩形是组件名
|
||
╚═══╝ │
|
||
└────────────────────────┘
|
||
```
|
||
|
||
简化字符画(更便于手写):
|
||
|
||
```
|
||
┌──┐
|
||
│ ├───── ┌────────────────┐
|
||
└──┘ │ OrderService │
|
||
└────────────────┘
|
||
```
|
||
|
||
⚠️ **命名方式**:
|
||
- `OrderService.java` —— 包含扩展名的具体组件
|
||
- `<<component>>` + `OrderService` —— 用版型标识
|
||
|
||
### 2. 组件的两种画法
|
||
|
||
**带版型的标准画法**:
|
||
|
||
```
|
||
┌──┐
|
||
│ ├───── ┌────────────────────┐
|
||
└──┘ │ <<component>> │
|
||
│ OrderService │
|
||
└────────────────────┘
|
||
```
|
||
|
||
**简化的文件/类表示法**(在组件图里很常见):
|
||
|
||
```
|
||
┌──┐
|
||
│ ├───── ┌────────────────────┐
|
||
└──┘ │ OrderService.java│ ← 写上扩展名
|
||
└────────────────────┘
|
||
```
|
||
|
||
### 3. 接口(Interface)—— 棒棒糖 / 插座
|
||
|
||
**棒棒糖表示法**(提供方在提供接口时用):
|
||
|
||
```
|
||
┌──────┐
|
||
客户端 │ 飞行 │ ← 圆圈 + 接口名
|
||
┌────┐ │ │
|
||
│ 鸟 │──●────┘ ↑ │ ← ● 是棒棒糖圆圈
|
||
└────┘ │ │
|
||
└───┘
|
||
```
|
||
|
||
**插座表示法**(需要方在实现接口时用):
|
||
|
||
```
|
||
┌────┐ ┌──────┐
|
||
│ 鸟 │ ─────────┤ 飞行 │
|
||
└────┘ ◀──── └──────┘
|
||
│ 半圆+连接线 │
|
||
│ (socket) │
|
||
```
|
||
|
||
简化字符画:
|
||
|
||
```
|
||
┌────────┐
|
||
│ 鸟 │ ●────── 飞行 (提供方:lollipop)
|
||
└────────┘
|
||
|
||
┌────────┐
|
||
│ 飞机 │ ◀──半圆──── 飞行 (需要方:socket)
|
||
└────────┘
|
||
```
|
||
|
||
### 4. 组件之间的关系
|
||
|
||
**依赖关系**(最常见 —— 一个组件调用另一个组件):
|
||
|
||
```
|
||
┌──┐ ┌──┐
|
||
│ ├──────┐ │ │
|
||
└──┘ │ └──┘
|
||
│ ┌────────────────┐
|
||
│ │ LoginService │
|
||
│ └────────────────┘
|
||
│ ┌────────────────┐
|
||
┌─────────┴─▶│ UserService │
|
||
│ ┌────────────────┐ │
|
||
└──│ LoginUI │ │
|
||
└────────────────┘ │
|
||
┌──┐ │
|
||
│ ├──┐ ┌────────────────┐ │
|
||
└──┘ └─▶│ DataService │◀───┘
|
||
└────────────────┘
|
||
(虚线箭头表示依赖)
|
||
```
|
||
|
||
简化画法(虚线箭头):
|
||
|
||
```
|
||
┌──────────────┐
|
||
│ OrderUI │
|
||
│ OrderCtrl │ ╌ ─ ─ ─ ─ ─▶ ┌──────────────┐
|
||
└──────────────┘ (依赖) │ OrderService│
|
||
└──────────────┘
|
||
```
|
||
|
||
**实现关系**(组件实现接口):
|
||
|
||
```
|
||
┌──────────────┐ ●──── 支付接口
|
||
│ 支付组件 │ ──────────── /
|
||
└──────────────┘ 实现关系
|
||
```
|
||
|
||
### 5. 结点(Node)—— 立方体
|
||
|
||
> 部署图的核心元素。立方体代表一台**物理设备**。
|
||
|
||
**字符画表现**(立方体用三视图):
|
||
|
||
```
|
||
┌──────────────┐
|
||
╱│ ╱│
|
||
╱ │ ╱ │
|
||
┌──────────────┐ │
|
||
│ │ │ │
|
||
│ │ Web │ │
|
||
│ │ Server │ │
|
||
│ └───────────│──┘
|
||
│ ╱ │ ╱
|
||
│╱ │╱
|
||
└──────────────┘
|
||
```
|
||
|
||
**简化字符画**(考试/笔记常用):
|
||
|
||
```
|
||
┌──────────────┐
|
||
│ ┌────────┐ │
|
||
│ │ Web │ │ ← 立方体的"上表面"(可选)
|
||
│ │ Server │ │
|
||
│ └────────┘ │
|
||
└──────────────┘
|
||
|
||
┌──────────┐
|
||
╱│ Web ╱│
|
||
╱ │ Server ╱ │
|
||
┌──────────┐ │
|
||
│ ┌────┐ │ │
|
||
│ │名称│ │ │
|
||
│ └────┘ │ │
|
||
└──────────┘ │
|
||
│ │ ╱
|
||
└────────┘
|
||
```
|
||
|
||
最简洁的字符画(最推荐使用):
|
||
|
||
```
|
||
╔═══════════════╗
|
||
║ <<device>> ║ ← 设备结点
|
||
║ WebServer ║
|
||
╚═══════════════╝
|
||
```
|
||
|
||
**处理机结点 vs 设备结点**(都用立方体,靠版型区分):
|
||
|
||
```
|
||
处理机结点 设备结点
|
||
|
||
╔═══════════════╗ ╔═══════════════╗
|
||
║ <<processor>> ║ ║ <<device>> ║
|
||
║ WebServer ║ ║ Modem ║
|
||
╚═══════════════╝ ╚═══════════════╝
|
||
(有CPU,可计算) (没有计算能力)
|
||
```
|
||
|
||
### 6. 结点内运行的组件
|
||
|
||
> 在结点立方体里"装"上组件,组件画在结点内部。
|
||
|
||
```
|
||
╔═══════════════════════════╗
|
||
║ <<processor>> ║
|
||
║ WebServer ║
|
||
║ ║
|
||
║ ┌──┐ ║
|
||
║ │ ├──── ┌────────────┐ ║
|
||
║ └──┘ │<<component>>║ ║
|
||
║ │ WebApp.jar │ ║
|
||
║ └────────────┘ ║
|
||
║ ║
|
||
║ ┌──┐ ║
|
||
║ │ ├──── ┌────────────┐ ║
|
||
║ └──┘ │<<component>>║ ║
|
||
║ │ DBDriver │ ║
|
||
║ └────────────┘ ║
|
||
╚═══════════════════════════╝
|
||
```
|
||
|
||
简化版本:
|
||
|
||
```
|
||
╔═══════════════╗
|
||
║ WebServer ║
|
||
║ ║
|
||
║ ┌──┐ ║
|
||
║ │ ├─ WebApp ║ ← 组件在结点里
|
||
║ └──┘ ║
|
||
╚═══════════════╝
|
||
```
|
||
|
||
### 7. 结点之间的连接
|
||
|
||
> 部署图上的"线"表示物理通信路径。
|
||
|
||
```
|
||
╔═══════════╗ ╔═══════════╗
|
||
║ 客户端 ║ ║ 服务器 ║
|
||
║ (PC机) ║ ║ ║
|
||
╚═════╤═════╝ ╚═════╤═════╝
|
||
│ │
|
||
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
||
│ TCP/IP │
|
||
│ │
|
||
```
|
||
|
||
**多重连接**(同一对结点可能有多种连接):
|
||
|
||
```
|
||
╔═══════════╗ ╔═══════════╗
|
||
║ 客户端 ║ ━━━━━━━TCP/IP ━━━━━━━━━ ║ Web服务器 ║
|
||
║ ║ ━━━━━━━ HTTPS ━━━━━━━━━ ║ ║
|
||
╚═══════════╝ ╚═══════════╝
|
||
```
|
||
|
||
### 8. 完整部署图示例
|
||
|
||
```
|
||
TCP/IP
|
||
━━━━━━━━━━━━━━━━━━━━
|
||
╔══════════╗ ╔══════════════════╗
|
||
║<<device>>║ ║ <<processor>> ║
|
||
║ 客户机 ║ ║ Web服务器 ║
|
||
║ ║ ║ ║
|
||
║ ┌──┐ ║ ║ ┌──┐ ║
|
||
║ │ ├─◀━━╫━━━━━━调用━━━━━━━━╫──┤ ├─ WebApp.jar║
|
||
║ └──┘ ║ ║ └──┘ ║
|
||
║ 浏览器 ║ ║ ║
|
||
╚══════════╝ ╚══════════════════╝
|
||
│
|
||
│ JDBC
|
||
│
|
||
╔══════════════════╗
|
||
║ <<processor>> ║
|
||
║ 数据库服务器 ║
|
||
║ ║
|
||
║ ┌──┐ ║
|
||
║ │ ├─ MySQL.db ║
|
||
║ └──┘ ║
|
||
╚══════════════════╝
|
||
```
|
||
|
||
🔑 **一句话记忆口诀**:组件左上方两个小方块,接口是圆圈加棒棒糖;结点是立方体(靠版型区分处理机/设备),立方体里装组件,立方体之间是通信连接。
|
||
|
||
---
|
||
|
||
## ✍️ 边学边练
|
||
|
||
**题目**:某Web系统包括以下内容,请区分逻辑模型和物理模型。
|
||
|
||
① 用户类(User)、订单类(Order)
|
||
② User.java、Order.java放在src/entity目录下
|
||
③ 用户登录要用到LoginAction.java
|
||
④ 整个系统部署在一台Web服务器和一台数据库服务器上
|
||
⑤ 用户→登录界面→输入信息→验证→跳转主页
|
||
|
||
**答案:**
|
||
- ① **逻辑模型(类图)**—— 描述有哪些类
|
||
- ② **物理模型(包图+组件图)**—— 描述文件放哪个目录
|
||
- ③ **物理模型(组件图)**—— 描述组件之间的依赖
|
||
- ④ **物理模型(部署图)**—— 描述硬件部署
|
||
- ⑤ **逻辑模型(顺序图/活动图)**—— 描述交互流程
|
||
|
||
---
|
||
|
||
## 📝 章末自测
|
||
|
||
**1. 填空题**
|
||
- 组件的三种类型是:( ___ )( ___ )、( ___ )( ___ )、( ___ )( ___ )
|
||
- 正向工程是指从( ___ )( ___ )生成( ___ )( ___ )
|
||
- 部署图中的结点分两种:( ___ )( ___ )和( ___ )( ___ )
|
||
|
||
**2. 判断题**
|
||
- ( ) 一个组件只能包含一个类
|
||
- ( ) 组件图描述的是系统的物理结构
|
||
- ( ) 部署图中的连接表示硬件之间的通信路径
|
||
- ( ) 类图是物理模型,组件图是逻辑模型
|
||
|
||
**3. 简答题**
|
||
- 简述组件和类的关系。
|
||
|
||
**答案:**
|
||
**填空题**:部署组件、工作产品组件、执行组件;模型、代码;处理机结点、设备结点
|
||
|
||
**判断题**:❌(可包含多个) ✅ ✅ ❌(反过来)
|
||
|
||
**简答题**:
|
||
- 类是逻辑概念,组件是物理概念。一个组件(如.java文件)可以包含一个或多个类。组件是为了"软插件"理念——将类打包成可替换的物理单元。类之间的关系决定了组件之间的关系。
|
||
|
||
---
|
||
> 🔗 上一篇:[第6章 状态图与活动图](第06章-状态图与活动图.md) | 下一篇:[第8章 包图](第08章-包图.md)
|