云计算百科
云计算领域专业知识百科平台

Day05-系统设计-面向对象分析与设计

0、开篇:从"面向过程"到"面向对象"

在上一篇中,给大家讲解完结构化方法(SASD)。它把系统按功能拆成模块,让数据在模块之间流动。

但这种方法有一个天然盲区:它把"数据"和"行为"分开了。数据字典管数据,DFD 管数据怎么流动。数据和行为是割裂开的。

面向对象(Object-Oriented)可以解决这个问题。它的核心思想就一句话:

把数据和处理数据的行为,封装在同一个"对象"里。

面向对象你可以理解为:一个人:有 姓名、年龄、身高是属性(数据),会吃饭、说话、走路是方法(行为)——属性和方法绑定在一起,构成一个完整的个体。而人类的共同特征(一个脑袋两条腿)则是类——类是对象的模板,对象是类的实例。

理解了它,那我们怎么用一套统一的语言,把对象和对象之间的关系画出来?答案就是 UML。

1、UML 统一建模语言的"骨架"

1.1 什么是 UML?

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

UML 的结构由三个部分构成:构造块、规则和公共机制。

1.2 UML的4+1 视图:五个视角看同一个系统

UML 最有价值的框架就是 4+1 视图——从不同角色的视角审视系统架构:

视图

核心问题

主要图种

关注者

用例视图

系统有哪些功能?谁在用?

用例图

客户、分析者、设计者、开发者和测试者

逻辑视图

系统内部怎么实现的?

类图、对象图、状态图、顺序图、合作图、活动图

系统分析、设计人员

进程视图

并发怎么处理?线程怎么通信?

状态图、顺序图、合作图、活动图、构件图、部署图

开发者、系统集成者

实现视图

代码怎么组织的?模块怎么依赖?

构件图

设计者、开发者、测试者

部署视图

软件跑在哪些机器上?

部署图

开发者、系统集成者、测试者

⚠️ 这个 4+1 视图和 RUP 的 4+1 视图一模一样。核心视图是用例视图,它是其他四个视图的源头——先搞清楚"要做什么",再谈"怎么做"。

1.3 UML 图的分类:结构图 vs 行为图

UML的关系有4种,依赖、关联、泛化(又叫继承)、实现。其他的关系是基于这4种中的某一种关系的延申。比如用例图中的包含和扩展都属于依赖关系。类图中的组合和聚合属于关联关系。

UML 2.0 一共有 14 种图,分为两大类:

结构图 — 描述事物之间的关系(静态):

名称

描述

使用场景

类图

描述类、接口、协作及它们之间的关系

系统静态结构设计,代码设计的核心依据

对象图

描述对象及对象之间的关系

展示系统某一时刻的具体实例状态

包图

描述包及包之间的依赖关系

大型系统的模块划分

组合结构图

描述系统某一部分的内部结构

复杂组件内部构成分析

构件图/组件图

描述构件及其相互依赖关系

物理组件的组织结构

部署图

展示构件在各节点上的部署

系统物理部署规划

外廓图

展示构造型、元类等扩展机制

UML 自定义扩展

行为图 — 描述参与者和用例之间的交互(动态):

名称

描述

使用场景

顺序图/序列图

展示对象间消息交互,强调执行顺序

描述用例实现流程

通信图/协作图

展示对象间消息交互,强调对象协作

关注对象间的组织结构

时间图/定时图

强调真实时间信息

实时系统、通信协议时序分析

交互概览图

展示交互图之间的执行顺序

复杂业务流程中多个交互图的组合

活动图

描述事物执行的控制流或数据流

业务流程建模、算法流程描述

状态机图

描述对象状态转移

对象生命周期建模

用例图

描述用例、参与者及相互关系

需求分析阶段定义系统功能边界

考试重点关注 用例图、类图、活动图、状态图、顺序图 五种,其他了解即可。

2、类图 — 面向对象设计的核心

2.1 类的三个"格子"

一个类在 UML 中用一个三格矩形表示:

2.2 类图的六种关系

类图的核心是表达类与类之间的关系。共有六种,包括:依赖、组合、聚合、关联、继承、实现。

① 依赖关系

构造这个类的时候,需要用到别的类。就像动物依赖水和氧气。

虚线箭头,指向被依赖方。

② 关联关系 — "我有一个属性是别的类"

这个类有一个属性,类型是另一个类。

实线箭头。

③ 聚合关系 — "整体-部分",部分可以独立存活

聚合是关联关系的一种,是强关联。

空心菱形实线,菱形指向整体。

关键特征:部分对象的生命周期不由整体管理。整体没了,部分还能活。比如大雁脱离雁群依然可以存活。

④ 组合关系 — "整体-部分",同生共死

组合也是关联关系的一种,比聚合更强。

实心菱形实线,菱形指向整体。

关键特征:部分与整体生命期一致。同时创建、同时消亡。比如鸟与翅膀——鸟死了,翅膀也不再是"翅膀"。

⚠️ 考试高频区分:聚合(空心菱形)vs 组合(实心菱形)。一句话:聚合是"可以分手,好聚好散",组合是"生死与共"。聚合关系是关联关系的一种,是强的关联关系 ;组合关系同样是关联关系的一种,是比聚合关系还要强的关系。

⑤ 继承(泛化)关系 — "is-a"关系

子类特化父类的所有特征和行为。

空心三角实线,三角指向父类。

鸟是动物的一种;企鹅、鸭、大雁是鸟的一种。

⑥ 实现关系 — 接口与实现类

类与接口的关系,表示类是接口所有特征和行为的实现。

空心三角虚线,三角指向接口。

类图讲清楚了"系统内部的组织结构"。但在这之前还有一件事没解决:用户到底能用系统干什么? 这就是用例图能做的了。

3、用例图 — 站在用户视角定义系统边界

3.1 什么是用例图?

用例图是一种静态图,由参与者、用例、边界以及它们之间的关系构成,用于描述系统功能的视图。

注意一个关键点:用例图是静态图并且它只展示"有哪些功能、谁在用",不描述操作的顺序。

3.2 四个基本元素

元素

表示

含义

系统

矩形框

被构建的软件或产品,框内放置所有用例,体现功能边界

参与者

小人图标 👤

与系统交互的外部角色(人、硬件、其他系统、时钟)

用例

椭圆

系统为参与者提供的完整功能

关系

连线

连接参与者与用例、用例与用例之间的线条

3.3 用例图的四种关系

用例图中共有四种关系:关联、泛化、包含、扩展。

注意下面的这个表格,考试要考。

① 关联关系 — 参与者与用例之间

参与者与用例之间的通信,任何一方都可发送或接受消息。

无箭头,将参与者与用例相连。

② 泛化关系 — 参与者/用例的继承

子用例和父用例相似,但表现出更特别的行为。子用例继承父用例的所有结构、行为和关系。

箭头指向父用例。

③ 包含关系 — 必须执行的分解

把一个较复杂的用例分解成较小的步骤。最典型的应用就是复用。

箭头指向被分解出来的功能用例。

例如:维护用户信息 → 包含「新增用户」「修改用户」「删除用户」。

④ 扩展关系 — 可选执行的延伸

为基用例提供一个可选的附加功能。扩展用例从基用例声明的扩展点上扩展,使基用例更简练。

关键特征:扩展用例对基用例不可见(调用方向单向);扩展用例可以访问基用例的属性来决定是否执行自己。

用例图四种关系速记

关系

符号

方向

含义

关联

实线无箭头

参与者 ↔ 用例

通信

泛化

空心三角实线

→ 指向父用例

继承

包含

虚线箭头 <<include>>

→ 指向被包含用例

必须执行

扩展

虚线箭头 <<extend>>

→ 指向基用例

可选执行

用例图描述了系统外部的人或系统(Actor),为了达成某个可观测、可量化的业务目标,而与系统进行的一系列有意义的交互。但用户执行一次交互时,对象之间是怎么一步步协作的?这就引出交互图。

4、交互图 — 对象之间的"对话"

4.1 顺序图(时序图/序列图)— 按时间线看调用

顺序图是一种 UML 交互图,按时间顺序展示各个对象之间如何调用。

它的元素包括:对象/生命线、交互片段、执行发生、状态不变式。

以微信支付流程为例:

顺序图的三种消息类型

消息类型

表示

含义

同步消息

实线实心箭头 →

发送者等待接收者响应后才继续执行

异步消息

实线空心箭头 →

发送者不等待响应,继续执行

返回消息

虚线箭头 ⇢

接收者将处理结果返回给发送者

区分:同步消息会阻塞等待,异步消息不阻塞。返回消息通常伴随同步消息一起出现。

4.2 通信图(协作图)— 按对象关系看协作

通信图描述一组对象在协作过程中如何互相通信,强调对象之间的结构关系。

组成:对象(类的实例)+ 链(对象之间的结构关系)+ 消息(对象间的调用)。

4.3 通信图与顺序图的区别

维度

顺序图

通信图

重点

消息的时间顺序

对象的组织结构

布局

时间线垂直展开

对象自由布局

适用

分析单个操作的详细调用链

理解一组对象的结构化协作

5、活动图 — 流程与并发的可视化

活动图描述事物或对象的活动变化流程,类似流程图,但支持并发。

适用场景:业务建模、需求分析、类设计。

举例:

活动图与之前结构化方法中讲的流程图(PFD)最大的不同在于:活动图天然支持并发(分叉/汇合),而传统流程图只能串行。 这是面向对象带来的表达能力跃迁。

到这里,UML 的几种核心图已经讲清楚了。但还有一道灵魂拷问:有了这些图,接下来的分析和设计该怎么组织?

这就进入了面向对象方法论的完整流程:OOA → OOD。

6、面向对象分析(OOA)— 用对象建模"要做什么"

OOA(Object-Oriented Analysis)运用面向对象方法对问题域进行分析,识别对象、类、属性、关系,构建独立于技术实现的分析模型。

简单说:在编码之前,用面向对象的方式把问题搞清楚。

关于OOA,在教材中提到了2个重要的模型,分别是用例模型和分析模型。这两个模型需要掌握。

用例模型(用例图表示) — 站在用户视角,说清"系统要做什么"。

分析模型(类图表示) — 站在系统视角,说清"怎么实现功能"。

6.1 用例模型:用例图表示,界定功能边界

从用户和业务角度描述系统的功能及其处理过程,帮助分析人员与用户达成需求共识。

组成元素:系统、参与者、用例、关系。

构建用例模型的 4 个阶段:识别参与者 → 合并需求获得用例 → 细化用例描述 → 调整用例模型。

识别参与者 — 不局限于"人"

参与者可以是任何驱动系统执行功能的外部角色:

参与者类型

描述

示例

其他系统

需要与其他系统交互

在线教育平台 ↔ OA 系统

硬件设备

系统需与硬件设备交互

IC 卡门禁系统 ↔ IC 卡读写器

时钟

系统需定时触发

在线测试"定时交卷" → 时钟作为参与者

6.2 分析模型:类图表示

分析模型描述系统的基本逻辑结构,展示对象和类如何组成系统(静态模型),以及它们如何保持通信,实现系统行为(动态模型)。把用户需求转化为系统内部结构与行为的抽象描述,描述“怎么实现功能”。

组成元素:其实就是由类图通过类与对象(模板与实例)、属性(特征描述)、操作(行为动作)和关系(关联、聚合、组合、泛化、依赖、实现等)描述系统的静态结构;交互图(如序列图)则通过消息传递展示对象间的动态协作过程。两者结合,分别从静态和动态视角完整刻画系统的结构与行为组合在一起的。

7、面向对象设计(OOD)— 把分析模型进行可实现

OOD 是 OOA 的延续。核心思想:抽象、封装和可扩展性(通过继承和多态实现)。

OOD 的核心工作之一,就是把分析阶段识别出来的类,按照职责进行分类。

7.1 三种类:各有各的职责

类型

职责

特征

怎么找?

实体类

映射需求中的实体,保存持久化信息

有属性,不一定有操作

从名词入手

控制类

控制用例工作,协调业务流程

没有属性,一定有方法

从动宾短语入手(如"身份验证"→"身份验证器")

边界类

封装内外流动的信息/数据流

可以既有属性也有方法

窗体、报表、通信协议、传感器接口等

快速判断口诀:

  • 实体类 → 名词(学生、课程、订单)
  • 控制类 → 动词+名词(身份验证器、订单处理器)
  • 边界类 → 对外接口(窗口、报表、API)
赞(0)
未经允许不得转载:网硕互联帮助中心 » Day05-系统设计-面向对象分析与设计
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!