【软考高级·系统分析师全链路通关实战】第 40 篇:设计模式在系统设计中的应用
本系列定位:面向有开发经验、从零备考软考高级「系统分析师」的工程师,以《系统分析师教程(第 2 版)》为主线,按「综合知识 → 案例分析 → 论文」三科组织,需求工程与 UML 建模深拆,60 篇带你从考试小白到三科同过。
本篇你将学到
- GoF 23 种设计模式的三分家族总表:创建型、结构型、行为型(各含哪些模式必须能归类)
- 案例高频八模式精讲:单例、工厂、观察者、策略、适配器、装饰器、代理、模板方法
- 每个模式:意图 + 结构 +云诊通场景一句话(大纲指定)
- 用 UML 类图表达模式(衔接第 16 篇类图六关系)与四段式答题模板
学完本篇,模块七(架构设计与系统设计)收官——你将从「会画架构图」进阶到「会用模式级的微结构语言」描述设计。
考点热力表
| 知识点 | 综合知识 | 案例分析 | 论文 |
|---|---|---|---|
| 23 模式三分家族归类 | ★★★ | ★ | ★ |
| 单例/工厂/观察者/策略 | ★★★ | ★★ | ★★ |
| 适配器/装饰器/代理 | ★★★ | ★★ | ★ |
| 模板方法 | ★★ | ★★ | ★ |
| 模式意图辨析(给场景选模式) | ★★★ | ★★ | ★★ |
| 模式与类图关系表达 | ★★ | ★★ | ★★ |
一、GoF 23 模式:三分家族总表
《设计模式:可复用面向对象软件的基础》收录 23 种模式,按目的分三族:
| 家族 | 关注点 | 模式清单(记忆版) |
|---|---|---|
| 创建型(5) | 对象怎么创建 | 单例、工厂方法、抽象工厂、建造者、原型 |
| 结构型(7) | 对象怎么组合 | 适配器、装饰器、代理、外观、组合、桥接、享元 |
| 行为型(11) | 对象怎么交互、职责怎么分配 | 观察者、策略、模板方法、命令、状态、职责链、迭代器、中介者、备忘录、访问者、解释器 |
综合知识最常见考法:给模式名问归类(观察者是行为型不是创建型;代理是结构型)与给场景选模式(下节八模式覆盖了 80% 命题面)。
(mindmap 层级有限,「其余五种」折叠记忆即可:迭代器顺序访问、中介者解耦多对象网状交互、备忘录快照恢复、访问者双分派加新操作、解释器解释语言文法——综合考到频次低于八模式。)
二、案例高频八模式精讲
2.1 单例 Singleton(创建型)
- 意图:保证一个类仅有一个实例,并提供全局访问点
- 结构:私有构造器 + 静态私有实例 + 静态获取方法
- 云诊通场景一句话:处方编号生成器全局唯一,防止并发开出重复处方号
- 考点:双重检查锁解决多线程下重复实例化
2.2 工厂方法 Factory Method(创建型)
- 意图:定义创建对象的接口,把实例化推迟到子类——调用方不 new 具体类
- 结构:Creator(声明工厂方法)← ConcreteCreator(返回具体产品)
- 云诊通场景一句话:问诊通道工厂按类型创建图文会话或视频会话,通道增减不改调用代码
- 辨析:抽象工厂造产品族(一次造一族相关对象),工厂方法造单个产品
2.3 观察者 Observer(行为型)
- 意图:一对多依赖,对象状态变化时自动通知所有依赖者
- 结构:Subject 维护 Observer 列表,notify 遍历调用 update(第 35 篇事件驱动架构在类级的微缩版;第 16 篇 MVC 中视图观察模型也是它)
- 云诊通场景一句话:问诊会话状态一变,医生端、超时计时器、审计留存多方自动收到通知
- 类图(衔接第 16 篇:空心三角=泛化/实现,实线菱形=聚合):
2.4 策略 Strategy(行为型)
- 意图:定义一族可互换的算法,运行时选择——把「做什么算法」从「谁用它」剥离
- 结构:Context 持有 Strategy 接口引用,具体策略实现接口
- 云诊通场景一句话:号源分配算法(先到先得/按权重/预留慢病号)配置切换,调度逻辑零修改
- 辨析:状态模式结构与策略几乎同构,但策略由调用方主动选,状态由对象内部随状态自动切换
2.5 适配器 Adapter(结构型)
- 意图:转换接口,使接口不兼容的类协同工作
- 结构:Adapter 实现/继承目标接口,内部包装被适配者
- 云诊通场景一句话:集成网关把 7 家医院 SOAP 通道适配为平台统一 REST 接口(第 36 篇协议转换的类级实现)
- 辨析:外观 Facade 是简化子系统入口(提供新门面),适配器是转换既有接口(迁就旧接口)
2.6 装饰器 Decorator(结构型)
- 意图:动态给对象附加职责,比继承更灵活的功能叠加
- 结构:Decorator 与被装饰者实现同一接口,Decorator 持有并包装组件实例
- 云诊通场景一句话:处方报文发送器动态叠加「加密装饰」「签名装饰」「压缩装饰」,按通道自由组合
- 辨析:代理控制访问(远程/延迟/权限),装饰增强功能——代理不改变接口语义,装饰是功能叠加链
2.7 代理 Proxy(结构型)
- 意图:控制对目标对象的访问(远程代理、虚代理延迟创建、保护代理鉴权)
- 结构:Proxy 与 RealSubject 同接口,Proxy 持有引用并在前后加控制逻辑
- 云诊通场景一句话:患者病历查询经保护代理做权限校验与脱敏后才转发真实服务
- 辨析:见装饰器;另记:AOP/拦截器思想是代理模式的工程化推广
2.8 模板方法 Template Method(行为型)
- 意图:父类定义算法骨架(固定步骤顺序),子类实现各步骤细节——「流程不变、步骤可变」
- 结构:抽象类含 final 模板方法(调用若干抽象基本方法),具体子类实现基本方法
- 云诊通场景一句话:审方流程骨架固定为「取处方→自动规则→人工复核→签名→留痕」,各医院子类只定制规则与复核细节
- 辨析:策略是整体算法可换(组合),模板方法是骨架固定步骤填充(继承)——考过多次的对比题
2.9 八模式速查表
| 模式 | 家族 | 一句话判定信号 | 云诊通一句话 |
|---|---|---|---|
| 单例 | 创建 | 全局唯一实例 | 处方编号生成器 |
| 工厂方法 | 创建 | 不 new 具体类、延迟到子类 | 会话通道工厂 |
| 观察者 | 行为 | 一变多知、自动通知 | 会话状态多方通知 |
| 策略 | 行为 | 算法族运行时可换 | 号源分配算法 |
| 适配器 | 结构 | 接口转换、兼容旧接口 | SOAP 转 REST 网关 |
| 装饰器 | 结构 | 功能动态叠加链 | 报文加密签名叠加 |
| 代理 | 结构 | 控制访问(鉴权/延迟/远程) | 病历查询保护代理 |
| 模板方法 | 行为 | 骨架固定、步骤子类填 | 审方流程骨架 |
三、模式答题模板与类图表达
3.1 四段式答题模板
案例分析问「该场景适合什么模式、为什么」时,四段作答:
- 模式名:明确点名(术语准确是第一采分点)
- 解决什么问题:把场景痛点翻译成模式意图语言(「接口不兼容」→适配器,「算法频繁更换」→策略)
- 结构:口述关键角色与关系(谁持用谁、谁实现谁),能画小类图更好
- 收益:带来的质量属性提升(解耦、可扩展、复用)+ 如需要补一句代价(类数量增加)
3.2 模式与模块七前文的呼应
设计模式是类/对象级的微结构,架构风格是系统级的宏结构,两者是同一「关注点分离」思想的不同尺度:第 35 篇事件驱动架构的运行时骨架,类级就是观察者;第 36 篇集成网关的协议转换,类级就是适配器加装饰器链;第 37 篇服务清单里 supervision-service 的重试补偿,类级是模板方法(骨架固定:组装→发送→验回执→补偿)。论文写设计章节时,用「宏结构指风格、微结构指模式」双层叙述,深度立现。
真题风格自测题
1. GoF 23 种设计模式按目的分为三族,观察者模式属于( )。
A. 创建型 B. 结构型 C. 行为型 D. 交互型
2. 下列全属于创建型模式的一组是( )。
A. 单例、工厂方法、抽象工厂、建造者、原型 B. 适配器、装饰器、代理 C. 观察者、策略、命令 D. 组合、外观、桥接
3. 保证一个类仅有一个实例并提供全局访问点的是( )。
A. 单例 B. 建造者 C. 享元 D. 外观
4. 定义创建对象的接口、把实例化推迟到子类的是( )。
A. 工厂方法 B. 模板方法 C. 原型 D. 代理
5. 一对多依赖关系、状态变化时自动通知所有依赖对象的是( )。
A. 观察者 B. 中介者 C. 职责链 D. 迭代器
6. 把一族可互换算法封装起来、运行时选择使用的是( )。
A. 策略 B. 状态 C. 命令 D. 备忘录
7. 将一个类的接口转换成客户期望的另一个接口,使不兼容类协同工作的是( )。
A. 适配器 B. 外观 C. 组合 D. 桥接
8. 动态地给对象附加额外职责、功能可叠加的是( )。
A. 装饰器 B. 代理 C. 享元 D. 适配器
9. 控制对目标对象的访问、可承担鉴权与延迟创建职责的是( )。
A. 代理 B. 装饰器 C. 外观 D. 组合
10. 父类定义算法骨架、子类实现各步骤的是( )。
A. 模板方法 B. 策略 C. 状态 D. 命令
11. 代理与装饰器结构相似,本质区别是( )。
A. 代理控制访问,装饰器动态叠加功能 B. 装饰器不能加接口 C. 代理必须远程 D. 无区别
12. 抽象工厂与工厂方法的区别,正确的说法是( )。
A. 抽象工厂创建产品族(一族相关对象),工厂方法创建单个产品 B. 完全相同 C. 工厂方法不返回对象 D. 抽象工厂只能造一个对象
13. 云诊通集成网关将医院 SOAP 通道转换为统一 REST 接口,最贴切的模式类比是( )。
A. 适配器 B. 单例 C. 观察者 D. 模板方法
14. 策略模式与状态模式的辨析,正确的是( )。
A. 两者结构不同 B. 策略由调用方主动选择算法,状态由对象内部随状态自动切换 C. 状态模式属创建型 D. 策略模式不能更换算法
15. 案例题问「该场景适合什么模式并说明理由」,最完整的作答结构是( )。
A. 只写模式名 B. 模式名+解决什么问题+结构+收益(必要时补代价)四段 C. 只画图不解释 D. 列举全部 23 个模式
参考答案:1.C 2.A 3.A 4.A 5.A 6.A 7.A 8.A 9.A 10.A 11.A 12.A 13.A 14.B 15.B(第 7/8/9 题合记:转接口→适配器、叠功能→装饰器、控访问→代理)
本篇小结
| 知识点 | 核心内容 |
|---|---|
| 三分家族 | 创建型 5(怎么建)、结构型 7(怎么组合)、行为型 11(怎么交互) |
| 八模式判定信号 | 唯一实例→单例;延迟实例化→工厂;一变多知→观察者;换算法→策略;转接口→适配器;叠功能→装饰器;控访问→代理;骨架固定→模板方法 |
| 易混辨析 | 代理 vs 装饰器(控制 vs 增强);策略 vs 状态(主动选 vs 自动切);工厂方法 vs 抽象工厂(单产品 vs 产品族);适配器 vs 外观(转换 vs 简化) |
| 类图表达 | 观察者:Subject 聚合 Observer;实现用虚线三角,聚合用实线菱形(第 16 篇六关系) |
| 答题四段式 | 模式名→解决什么问题→结构→收益(+代价) |
| 宏微呼应 | 架构风格是系统级宏结构,设计模式是类级微结构,同一关注点分离思想的两个尺度 |
| 模块七收官 | 34 总论视图→35 风格论证→36 SOA 与集成→37 微服务拆分→38 概要与模块→39 详细与接口→40 模式微结构 |
下篇预告
第 41 篇:软件实现——程序设计语言与编码规范考点
进入模块八:编译与解释、强类型弱类型、第四代语言等语言特性判定,编码规范与静态分析,持续集成与云诊通技术选型论证(论文素材)。
如果本篇内容对你有帮助,欢迎点赞收藏!有任何疑问,欢迎在评论区交流。