跳转至

开放-封闭原则

约 569 个字 15 行代码 1 张图片 预计阅读时间 3 分钟

场景:考研与求职

小菜为考研放弃求职准备,落榜后两手空空。大鸟以 「一国两制」 类比:社会主义制度不能修改(稳定核心),但可在香港实行 资本主义制度(扩展新制度)——在不变更根本的前提下增加灵活性。软件设计中的 开放-封闭原则 正是这一思想。

原则定义

开放-封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该可以扩展,但是不可修改。

两个特征:

  1. 对扩展开放(Open for extension):新需求通过 新增 代码满足。
  2. 对修改封闭(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、改一处动全身

开放-封闭是面向对象设计中 最重要 的原则之一,后续多数设计模式都在具体场景下落实这一思想。

评论