Appearance
设计模式
设计模式(Design Patterns)是软件开发中反复出现的问题的通用解决方案,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(GoF 四人组)在 1994 年系统总结,共 23 种经典模式。
一、设计模式六大原则
| 原则 | 英文 | 核心思想 |
|---|---|---|
| 单一职责原则 | SRP(Single Responsibility Principle) | 一个类只负责一个职责 |
| 开闭原则 | OCP(Open-Closed Principle) | 对扩展开放,对修改关闭 |
| 里氏替换原则 | LSP(Liskov Substitution Principle) | 子类可以替换父类且行为不变 |
| 接口隔离原则 | ISP(Interface Segregation Principle) | 接口应该小而专一,不强迫实现不需要的方法 |
| 依赖倒置原则 | DIP(Dependency Inversion Principle) | 依赖抽象,不依赖具体实现 |
| 迪米特法则 | LoD(Law of Demeter) | 最少知识原则,只与直接朋友通信 |
SOLID = SRP + OCP + LSP + ISP + DIP
二、23 种设计模式分类
创建型模式(5 种)
关注对象的创建过程,将对象的创建与使用分离。
| 模式 | 一句话描述 |
|---|---|
| 单例模式 | 确保类只有一个实例 |
| 工厂方法模式 | 子类决定创建哪个对象 |
| 抽象工厂模式 | 创建一系列相关对象 |
| 建造者模式 | 分步骤构建复杂对象 |
| 原型模式 | 通过克隆创建对象 |
结构型模式(7 种)
关注类和对象的组合,形成更大的结构。
| 模式 | 一句话描述 |
|---|---|
| 适配器模式 | 转换接口,让不兼容的类一起工作 |
| 桥接模式 | 分离抽象与实现,各自独立变化 |
| 组合模式 | 树形结构处理整体与部分 |
| 装饰器模式 | 动态给对象添加功能 |
| 外观模式 | 提供统一的高层接口 |
| 享元模式 | 共享细粒度对象,节省内存 |
| 代理模式 | 控制对对象的访问 |
行为型模式(11 种)
关注对象间的通信和职责分配。
| 模式 | 一句话描述 |
|---|---|
| 责任链模式 | 请求沿链传递,直到被处理 |
| 命令模式 | 将请求封装为对象 |
| 解释器模式 | 定义语言的文法并解释 |
| 迭代器模式 | 统一遍历集合元素 |
| 中介者模式 | 用中介对象封装交互 |
| 备忘录模式 | 保存和恢复对象状态 |
| 观察者模式 | 一对多依赖通知 |
| 状态模式 | 对象状态改变时改变行为 |
| 策略模式 | 算法族可互相替换 |
| 模板方法模式 | 定义算法骨架,子类实现细节 |
| 访问者模式 | 在不改变元素类的前提下定义新操作 |
三、模式之间的关系
创建型模式(对象创建)
│
├── 单例 ──→ 享元(共享实例思想)
├── 工厂方法 ──→ 抽象工厂(扩展维度)
├── 建造者 ──→ 组合(构建复杂对象)
└── 原型 ──→ 备忘录(状态保存/恢复)
结构型模式(对象组合)
│
├── 适配器 ──→ 外观(接口转换思想)
├── 装饰器 ──→ 代理(包装对象,增强功能)
├── 桥接 ──→ 策略(分离变化维度)
└── 组合 ──→ 责任链(树形递归结构)
行为型模式(对象通信)
│
├── 策略 ──→ 状态(算法/行为切换)
├── 观察者 ──→ 中介者(通信方式变化)
├── 模板方法 ──→ 策略(继承 vs 组合)
└── 命令 ──→ 备忘录(操作记录与撤销)四、学习路线建议
入门必学(5 个):
单例 → 工厂方法 → 策略 → 观察者 → 代理
→ 这 5 个最常用,几乎每个项目都会遇到
进阶学习(8 个):
装饰器 → 模板方法 → 责任链 → 建造者 → 适配器
→ 外观 → 组合 → 状态
深入理解(10 个):
抽象工厂 → 原型 → 桥接 → 享元 → 命令
→ 迭代器 → 中介者 → 备忘录 → 访问者 → 解释器