Files
obsidian/软件需求分析/各章笔记/第07章-组件图与部署图.md

16 KiB
Raw Permalink Blame History

第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章 状态图与活动图 | 下一篇:第8章 包图