面向对象——开闭原则(Open-Closed Principle, OCP)

开闭原则(Open-Closed Principle, OCP) 是面向对象设计中的重要原则之一,它的核心思想是:

  • 对扩展开放(Open for extension):软件实体(类、模块、函数等)应该可以扩展,以满足新的需求。
  • 对修改关闭(Closed for modification):在扩展功能时,不应该修改已有的代码,而是通过新增代码来实现变化。

通俗理解

想象你经营了一家餐厅,菜单已经固定,但你想增加新菜品。

  • 如果你直接修改菜单(修改已有代码),可能会影响老顾客的习惯,甚至导致错误。
  • 更好的做法是:新增一个菜品(扩展代码),而不是修改现有菜单。

如何遵循开闭原则

  1. 使用抽象(接口或抽象类):让具体实现继承或实现抽象,而不是修改原有代码。
  2. 使用多态:基于抽象定义行为,不直接依赖具体实现。
  3. 组合优于继承:通过组合不同对象来扩展功能,而不是修改现有代码。

违反开闭原则的例子

假设我们有一个形状类 Shape,它支持计算面积:

java 复制代码
class Shape {
    String type;
}
class AreaCalculator {
    public double calculateArea(Shape shape) {
        if (shape.type.equals("circle")) {
            return Math.PI * 5 * 5; // 假设半径是5
        } else if (shape.type.equals("rectangle")) {
            return 10 * 5; // 假设长10宽5
        }
        return 0;
    }
}

问题:

  • 如果要添加新的形状(比如三角形),我们必须修改 calculateArea() 方法,违反了开闭原则。

符合开闭原则的实现

我们可以使用抽象类来避免修改已有代码:

java 复制代码
abstract class Shape {
    abstract double getArea();
}

class Circle extends Shape {
    double radius;
    Circle(double radius) { this.radius = radius; }
    double getArea() { return Math.PI * radius * radius; }
}

class Rectangle extends Shape {
    double width, height;
    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    double getArea() { return width * height; }
}

class AreaCalculator {
    public double calculateArea(Shape shape) {
        return shape.getArea(); // 直接调用多态方法
    }
}

好处:

  • 不修改 AreaCalculator 的代码,而是扩展 Shape,符合开闭原则。
  • 如果新增 Triangle,只需创建新类,而不影响 AreaCalculator

总结

开闭原则的核心是:扩展功能时,不要修改已有代码,而是新增代码。

它使代码更稳定、更易维护,符合面向对象编程的设计理念。

相关推荐
烟锁池塘柳0几秒前
【大模型】解码策略:Greedy Search、Beam Search、Top-k/Top-p、Temperature Sampling等
人工智能·深度学习·机器学习
盼小辉丶15 分钟前
PyTorch实战(14)——条件生成对抗网络(conditional GAN,cGAN)
人工智能·pytorch·生成对抗网络
Allen_LVyingbo1 小时前
数智读书笔记系列035《未来医疗:医疗4.0引领第四次医疗产业变革》
人工智能·经验分享·笔记·健康医疗
zzc9211 小时前
时频图数据集更正程序,去除坐标轴白边及调整对应的标签值
人工智能·深度学习·数据集·标签·时频图·更正·白边
isNotNullX1 小时前
什么是数据分析?常见方法全解析
大数据·数据库·数据仓库·人工智能·数据分析
riveting1 小时前
明远智睿H618:开启多场景智慧生活新时代
人工智能·嵌入式硬件·智能硬件·lga封装·3506
夜阑卧听风吹雨,铁马冰河入梦来1 小时前
Spring AI 阿里巴巴学习
人工智能·学习·spring
c7692 小时前
【文献笔记】Automatic Chain of Thought Prompting in Large Language Models
人工智能·笔记·语言模型·论文笔记
Blossom.1182 小时前
机器学习在智能供应链中的应用:需求预测与物流优化
人工智能·深度学习·神经网络·机器学习·计算机视觉·机器人·语音识别
Gyoku Mint2 小时前
深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
人工智能·pytorch·python·深度学习·神经网络·算法·聚类