开放-封闭原则¶
约 569 个字 15 行代码 1 张图片 预计阅读时间 3 分钟
场景:考研与求职¶
小菜为考研放弃求职准备,落榜后两手空空。大鸟以 「一国两制」 类比:社会主义制度不能修改(稳定核心),但可在香港实行 资本主义制度(扩展新制度)——在不变更根本的前提下增加灵活性。软件设计中的 开放-封闭原则 正是这一思想。
原则定义¶
开放-封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该可以扩展,但是不可修改。
两个特征:
- 对扩展开放(Open for extension):新需求通过 新增 代码满足。
- 对修改封闭(Closed for modification):已有稳定代码尽量 不改。
核心直觉¶
- 需求一定会变;设计目标是在需求变化时 少改旧代码、多写新代码。
- 大鸟用 考勤 举例:严格打卡 vs 弹性工作制——对「工作时长/业绩」这一核心 关闭修改,对「时间制度」 开放扩展。
与 SRP 的关系¶
违反 SRP 的上帝类往往也违反 OCP:职责堆在一起,任何小扩展都可能牵动整文件。先划清职责,再对易变点抽象,更容易做到对扩展开放。
简单对比¶
Java
// 违反 OCP:每加一种优惠就要改这个方法
class OrderService {
Money discount(Order o, String type) {
if ("VIP".equals(type)) { /* ... */ }
else if ("NEW_USER".equals(type)) { /* ... */ }
return o.total();
}
}
// 更符合 OCP:扩展通过新增 DiscountPolicy 实现
interface DiscountPolicy { Money apply(Order o); }
class OrderService {
private final DiscountPolicy policy;
Money finalPrice(Order o) { return policy.apply(o); }
}
新增折扣时,只需 新增 DiscountPolicy 实现类,无需修改 OrderService(详见 策略模式)。
何时应对变化¶
大鸟强调:无法在一开始就预见所有变化。应识别程序中 容易变化 与 相对稳定 的部分,对变化部分 抽象,对稳定部分 封装——这就是 OCP 的落地方式。
小结¶
| 要点 | 说明 |
|---|---|
| 目标 | 扩展新功能时少改旧代码 |
| 手段 | 抽象 + 多态、策略、模板方法等 |
| 反模式 | 到处 if-else、改一处动全身 |
开放-封闭是面向对象设计中 最重要 的原则之一,后续多数设计模式都在具体场景下落实这一思想。