设计模式的六大原则是面向对象设计中指导模式创建和应用的核心思想,它们提升了代码的可维护性、扩展性和复用性。以下是六大原则的详细说明:
设计模式原则记忆技巧
├─ SOLID
│ ├─ S: 单一职责
│ ├─ O: 开闭原则
│ ├─ L: 里氏替换
│ ├─ I: 接口隔离
│ └─ D: 依赖倒置
└─ LoD: 迪米特法则
1. 单一职责原则(Single Responsibility Principle, SRP)
-
定义:一个类应该仅有一个引起它变化的原因(即一个类只负责一项职责)。
-
核心思想:通过拆分功能,避免类的过度耦合。
-
示例:
// 违反SRP:用户类同时管理用户信息和数据库操作 class User { void saveToDatabase() { /*...*/ } // 应拆分到单独的数据库类中 }
2. 开闭原则(Open-Closed Principle, OCP)
-
定义:软件实体(类、模块、函数)应对扩展开放,对修改关闭。
-
核心思想:通过抽象(接口、继承)实现扩展,而非直接修改现有代码。
-
示例:
interface Shape { double area(); } class Circle implements Shape { /*...*/ } // 新增形状时无需修改现有代码
3. 里氏替换原则(Liskov Substitution Principle, LSP)
-
定义:子类必须能够替换父类并保持程序的正确性。
-
核心思想:继承关系中,子类不应破坏父类的行为契约。
-
反例:
class Bird { void fly() {} } class Penguin extends Bird {} // 企鹅不会飞,违反LSP
4. 接口隔离原则(Interface Segregation Principle, ISP)
-
定义:客户端不应被迫依赖它不需要的接口。
-
核心思想:将庞大接口拆分为更小、更具体的接口。
-
示例:
interface Printer { void print(); } interface Scanner { void scan(); } // 而非一个包含所有方法的"多功能"接口
5. 依赖倒置原则(Dependency Inversion Principle, DIP)
-
定义:
- 高层模块不应依赖低层模块,两者应依赖抽象。
- 抽象不应依赖细节,细节应依赖抽象。
-
核心思想:通过依赖注入(DI)或接口解耦。
-
示例:
interface Storage { void save(); } class DatabaseStorage implements Storage {} // 高层模块依赖Storage接口而非具体实现
6. 迪米特法则(Law of Demeter, LoD)
-
定义:一个对象应尽可能少地了解其他对象(“只与直接朋友通信”)。
-
核心思想:降低类之间的耦合,避免链式调用(如
a.getB().getC().doSomething())。 -
改进示例:
class A { void doSomething(B b) { b.doSomething(); // A仅与B交互,不深入B的内部依赖 } }
总结
| 原则 | 关键目标 | 实现手段 |
|---|---|---|
| 单一职责原则(SRP) | 职责单一 | 拆分类/模块 |
| 开闭原则(OCP) | 扩展性 | 抽象化(接口、继承) |
| 里氏替换原则(LSP) | 继承安全 | 子类不破坏父类行为 |
| 接口隔离原则(ISP) | 接口精简 | 按需拆分接口 |
| 依赖倒置原则(DIP) | 解耦依赖 | 依赖抽象(DI) |
| 迪米特法则(LoD) | 减少耦合 | 限制交互范围 |
这些原则共同构成了设计模式的基础,实际应用中需灵活权衡,而非机械遵循。