面向对象设计原则:SOLID 与模式衔接
更新时间:2026-08-25。本文是
languages/oop/主题第 ④ 篇。设计原则是"为什么这么设计"的答案,设计模式是"具体怎么实现"的套路——先懂原则,再看模式才不会沦为背公式。
本文要回答的问题
- SOLID 六条原则分别解决什么问题?
- 原则和设计模式是什么关系?
- 怎么用原则指导日常类设计?
一、SOLID 六原则总览
| 原则 | 缩写 | 一句话 | 解决 |
|---|---|---|---|
| 单一职责 | S | 一个类只做一件事 | 类过大、职责混乱 |
| 开闭原则 | O | 对扩展开放,对修改关闭 | 加功能就改老代码 |
| Liskov 替换 | L | 子类可替换父类 | 继承破坏语义 |
| 接口隔离 | I | 接口小而专,避免胖接口 | 接口太大、依赖冗余 |
| 依赖倒置 | D | 依赖抽象,不依赖细节 | 高层被低层绑定 |
| 最少知识 | 迪米特 | 只和朋友说话 | 耦合扩散 |
二、逐条拆解
2.1 S:单一职责(SRP)
一个类应该只有一个引起它变化的原因。
// 违反:一个类干了三件事
class UserService {
void saveUser(User u) { /* DB */ }
void sendEmail(User u) { /* 邮件 */ }
void generateReport(User u) { /* 报表 */ }
}
// 遵守:按职责拆分
class UserRepository { void save(User u) { /* DB */ } }
class EmailSender { void send(User u) { /* 邮件 */ } }
class ReportGenerator { void generate(User u) { /* 报表 */ } }信号:类超过 ~200 行、方法超过 ~10 个、import 横跨多个业务域 → 考虑拆分。SRP 让每个类可独立修改、独立测试。
2.2 O:开闭原则(OCP)
对扩展开放,对修改关闭——新增行为通过扩展实现,不改既有代码。
最常用手段就是多态/接口(见 多态与接口):新增一个 implements Shape 的类即可,total() 一行不改。
2.3 L:Liskov 替换(LSP)
子类必须能替换父类且行为不破坏。详见 封装、继承与组合。
代码异味:用 instanceof 判断类型、覆写父类方法抛异常、改父类语义 → 都是 LSP 被破坏。
2.4 I:接口隔离(ISP)
客户端不应被迫依赖它用不到的接口。
// 违反:胖接口,Bird 不需要 swim()
interface Animal { void eat(); void fly(); void swim(); }
// 遵守:细粒度接口
interface Eater { void eat(); }
interface Flyer { void fly(); }
interface Swimmer { void swim(); }信号:一个接口方法很多、实现类被迫写空实现或抛 UnsupportedOperationException → 拆接口。
2.5 D:依赖倒置(DIP)
高层不依赖低层,二者都依赖抽象;抽象不依赖细节,细节依赖抽象。
// 违反:高层依赖具体类
class OrderService {
private MySQLRepo repo = new MySQLRepo(); // 绑死 MySQL
}
// 遵守:依赖抽象接口
class OrderService {
private final OrderRepo repo; // 依赖注入
OrderService(OrderRepo repo) { this.repo = repo; }
}配合依赖注入(DI),运行期可替换实现(MySQL/Postgres/内存),测试注入 mock——这是 Spring 的核心思想。
2.6 最少知识(Law of Demeter)
对象只应与其直接交互的"朋友"通信,别越过朋友访问朋友的朋友。
// 违反:链式穿越
order.getCustomer().getAddress().getCity();
// 遵守:让 Order 直接提供
order.getShippingCity();三、原则 vs 模式:桥梁

| 原则 | 典型落地的模式 |
|---|---|
| 单一职责 SRP | 职责分离 → 策略、命令、门面 |
| 开闭 OCP | 扩展替换 → 策略、装饰器、观察者、模板方法 |
| Liskov LSP | 继承正确 → 所有依赖多态的模式 |
| 接口隔离 ISP | 细粒度接口 → 适配器、门面 |
| 依赖倒置 DIP | 抽象依赖 → 工厂、依赖注入、策略 |
| 最少知识 | 减少耦合 → 门面、中介者 |
四、设计模式全景(衔接)
本站 GoF 23 设计模式 按创建型/结构型/行为型分三族:
| 分类 | 模式 | 原则依托 |
|---|---|---|
| 创建型 | 工厂、抽象工厂、单例、建造者、原型 | DIP、封装对象创建 |
| 结构型 | 适配器、装饰器、代理、外观、组合、桥接、享元 | ISP、组合优先、最少知识 |
| 行为型 | 策略、观察者、模板方法、迭代器、状态、命令等 | OCP、多态、SRP |
学习路径建议:先掌握本文 SOLID 原则,再逐族学 23 种模式,最后用原则判断"该不该套这个模式"。
五、与本站主线衔接
- 设计模式:原则 → 模式的完整落点,见 GoF 23 设计模式。
- Java 工程:DI/接口隔离正是 Spring 自动装配的基础,见 Java 核心。
- 架构:SOLID 向上支撑后端分层与微服务拆解,见 后端开发。
一句话总结
SOLID 六原则(SRP/OCP/LSP/ISP/DIP/最少知识)回答"类为什么这么设计",是 23 种设计模式的指导思想;先立原则、再看模式,类设计才不至于沦为背套路。
上一节:多态与接口 深入:GoF 23 设计模式