10.5.6 设计模式拼写及分类汇总
这一节的目标是把 23 种 GoF 设计模式收束成一张可复习的地图。考试第一层要求是:看到英文名能识别中文名和分类;看到场景能识别模式;看到模式能匹配意图。
23种模式分类总表
| 大类 | 数量 | 中文名 | 英文名 |
|---|---|---|---|
| 创建型 | 5 | 工厂方法 | Factory Method |
| 创建型 | 5 | 抽象工厂 | Abstract Factory |
| 创建型 | 5 | 建造者/生成器 | Builder |
| 创建型 | 5 | 原型 | Prototype |
| 创建型 | 5 | 单例 | Singleton |
| 结构型 | 7 | 适配器 | Adapter |
| 结构型 | 7 | 桥接 | Bridge |
| 结构型 | 7 | 组合 | Composite |
| 结构型 | 7 | 装饰 | Decorator |
| 结构型 | 7 | 外观 | Facade |
| 结构型 | 7 | 享元 | Flyweight |
| 结构型 | 7 | 代理 | Proxy |
| 行为型 | 11 | 职责链 | Chain of Responsibility |
| 行为型 | 11 | 命令 | Command |
| 行为型 | 11 | 解释器 | Interpreter |
| 行为型 | 11 | 迭代器 | Iterator |
| 行为型 | 11 | 中介者 | Mediator |
| 行为型 | 11 | 备忘录 | Memento |
| 行为型 | 11 | 观察者 | Observer |
| 行为型 | 11 | 状态 | State |
| 行为型 | 11 | 策略 | Strategy |
| 行为型 | 11 | 模板方法 | Template Method |
| 行为型 | 11 | 访问者 | Visitor |
类模式与对象模式
课程提到“类模式/对象模式”的分类,但软考目前更常考创建型、结构型、行为型。了解即可:
| 大类 | 可能涉及类模式的模式 | 常见对象模式 |
|---|---|---|
| 创建型 | Factory Method 既可类模式也可对象模式 | Abstract Factory、Builder、Prototype、Singleton |
| 结构型 | Adapter 既可类模式也可对象模式 | Bridge、Composite、Decorator、Facade、Flyweight、Proxy |
| 行为型 | Template Method、Interpreter 可作为类模式 | Chain、Command、Iterator、Mediator、Memento、Observer、State、Strategy、Visitor |
考试如果在不确定时区分类模式/对象模式,课程提醒目前软考系列更常出现对象模式说法;但真正稳妥的做法还是先识别模式本身,再看选项。
四类常见考法
| 考法 | 说明 | 解题入口 |
|---|---|---|
| 场景识别 | 给业务描述,问采用哪种模式 | 抓“变化点”和“意图关键词” |
| 图式识别 | 给类图,问是哪种模式 | 找特殊类名、方法名、调用关系 |
| 分类判断 | 问某模式属于哪一类 | 记 5-7-11 表格 |
| 意图/适用场景 | 给多个意图,问哪个属于某模式 | 用一句话意图排除 |
高频关键词索引
| 关键词 | 模式 |
|---|---|
| 唯一实例、全局访问点 | Singleton |
| 一系列相关产品、产品族 | Abstract Factory |
| 子类决定实例化、延迟实例化 | Factory Method |
| 复杂对象、构建与表示分离 | Builder |
| 克隆、复制已有对象 | Prototype |
| 接口不兼容、转换接口 | Adapter |
| 两个独立变化维度、抽象与实现分离 | Bridge |
| 树形结构、整体-部分、一致使用 | Composite |
| 动态添加职责 | Decorator |
| 统一高层接口、封装子系统 | Facade |
| 大量细粒度对象共享 | Flyweight |
| 控制访问、远程/虚拟/保护代理 | Proxy |
| 层层审批、沿链传递 | Chain of Responsibility |
| 请求封装成对象、撤销、队列、日志 | Command |
| 文法、终结符、非终结符 | Interpreter |
| 顺序访问聚合对象、next | Iterator |
| 多对象交互由中心协调 | Mediator |
| 保存状态、恢复、备份 | Memento |
| 一对多联动、通知、订阅 | Observer |
| 内部状态改变导致行为改变 | State |
| 算法族、算法互换 | Strategy |
| 算法骨架、子类填步骤 | Template Method |
| visit、accept、数据与操作分离 | Visitor |
相近模式辨析清单
| 易混组 | 判断方法 |
|---|---|
| 工厂方法 vs 抽象工厂 | 工厂方法生产一个产品;抽象工厂生产一族相关产品 |
| 建造者 vs 抽象工厂 | 建造者强调复杂对象构建步骤;抽象工厂强调产品族 |
| 适配器 vs 外观 | 适配器转换不兼容接口;外观简化复杂子系统入口 |
| 装饰 vs 代理 | 装饰增加职责;代理控制访问 |
| 桥接 vs 访问者 | 桥接组合两个变化维度;访问者选择操作去访问对象结构 |
| 状态 vs 策略 | 状态封装状态;策略封装算法 |
| 观察者 vs 中介者 | 观察者是一对多通知;中介者协调多对象交互 |
| 命令 vs 职责链 | 命令把请求对象化;职责链让请求沿处理链传递 |
复习顺序
- 背三大类数量:创建型 5、结构型 7、行为型 11。
- 背英文名和中文名对应关系。
- 给每个模式写一句意图。
- 练相近模式辨析。
- 对照真题类图,标出特殊类名和方法名。
例题
Observer 模式属于:
类图中出现 `visit()` 和 `accept(visitor)`,并强调在不改变元素类的前提下增加操作,最可能是:
自查要点
- 创建型、结构型、行为型分别有哪些模式?
- 哪些模式考试里常通过英文类名直接识别?
- 为什么“类名与模式无关”时要回到应用场景?
- 状态、策略、访问者、桥接这四个相近模式如何区分?