面向对象设计模式有哪些原则
核心原则(SOLID)
- 单一职责原则(Single Responsibility Principle, SRP)
- 定义: 一个类应该只有一个职责,只因单一原因而改变。
- 关键点: 提高代码模块化,避免功能耦合,便于维护。
- 示例: 一个 User 类只负责用户信息管理,不应包含日志记录功能。
- 开闭原则(Open/Closed Principle, OCP)
- 定义: 软件实体(类、模块等)应对扩展开放,对修改关闭。
- 关键点: 通过继承、多态等方式扩展功能,而不是修改已有代码。
- 示例: 添加新支付方式时,通过继承支付基类实现,而不改动现有支付逻辑。
- 里氏替换原则(Liskov Substitution Principle, LSP)
- 定义: 子类必须能完全替代父类,不改变程序正确性。
- 关键点: 确保继承关系合理,子类行为与父类契约一致。
- 示例: 如果 Bird 类有 fly() 方法,Penguin 子类不应抛出异常禁用此功能。
- 接口隔离原则(Interface Segregation Principle, ISP)
- 定义: 客户端不应被迫依赖它不使用的接口。
- 关键点: 接口要小而专,避免“胖接口”。
- 示例: 将 Worker 接口拆分为 Eatable 和 Workable,让机器类只实现后者。
- 依赖倒置原则(Dependency Inversion Principle, DIP)
- 定义: 高层模块不应依赖低层模块,二者都应依赖抽象。
- 关键点: 通过接口或抽象类解耦,增强灵活性。
- 示例: 服务层依赖 Repository 接口,而不是具体的 MySQLRepository。
其他重要原则
-
组合优于继承 (Composition Over Inheritance)
- 优先使用对象组合而非继承来实现代码重用
- 避免继承带来的紧耦合问题
-
迪米特法则/最少知识原则 (Law of Demeter)
-
一个对象应该对其他对象有最少的了解
- 减少对象之间的依赖,只与"直接"的朋友通信
-
DRY原则 (Don't Repeat Yourself)
-
避免代码重复,每一个知识点在系统中只应该有一个表述
-
KISS原则 (Keep It Simple, Stupid)
-
保持设计的简单性,避免不必要的复杂性
-
YAGNI原则 (You Aren't Gonna Need It)
-
不要开发当前不需要的功能