开闭原则(OCP)

开闭原则(OCP)

介绍

开闭原则(Open-Closed Principle,OCP)是面向对象设计中的一个重要原则。它的定义为:软件中的对象(类、模块、函数等等)应该对扩展开放,对修改关闭。也就是说,在不修改原有代码的前提下,可以通过增加新的代码来实现新的功能。

原则

不修改原有代码的前提下,可以通过增加新的实现类来实现新的功能

正反案例

反例

下面是一个违反开闭原则的例子。假设有一个类 Shape 表示图形,它有两个方法:drawCircle()drawRectangle() 分别用来绘制圆形和矩形:

public class Shape {
    public void drawCircle() {
        // 绘制圆形
    }

    public void drawRectangle() {
        // 绘制矩形
    }
}

现在,需求变化了,需要新增一个方法 drawTriangle() 用来绘制三角形。如果直接修改原来的类,会违反开闭原则,因为修改原有代码可能会对原有功能造成影响,甚至引入新的 bug

正例

为了遵循开闭原则,可以采用以下方式来实现新功能:

  1. 定义一个抽象类 Shape,提供一个抽象方法 draw() 用于绘制图形。

    public abstract class Shape {
    public abstract void draw();
    }
  2. 创建三个具体类 CircleRectangleTriangle 分别实现 Shape 类,实现它们自己的绘图方法。

    绘制圆形
    public class Circle extends Shape {
    @Override
    public void draw() {
        // 绘制圆形
    }
    }
    绘制矩形
    public class Rectangle extends Shape {
    @Override
    public void draw() {
        // 绘制矩形
    }
    }
    绘制三角形
    public class Triangle extends Shape {
    @Override
    public void draw() {
        // 绘制三角形
    }
    }

这样,如果需要新增一个形状,只需要创建一个类并实现 Shape 接口即可

特点

  1. 对扩展开放:可以通过增加新的代码(比如实现类)来实现新的功能。
  2. 对修改关闭:不需要修改原有的代码(比如接口),从而保证原有功能的稳定性和正确性。

注意事项(*重点)

  1. 在设计类的时候,要将可能会发生变化的代码抽象出来,形成抽象类或接口,并尽量让它们保持稳定,从而避免修改原有的代码。
  2. 在实现功能扩展的时候,尽量避免修改原有代码,而是通过增加新的代码来实现扩展。