介绍
开闭原则(Open-Closed Principle,OCP)是面向对象设计中的一个重要原则。它的定义为:软件中的对象(类、模块、函数等等)应该对扩展开放,对修改关闭。也就是说,在不修改原有代码的前提下,可以通过增加新的代码来实现新的功能。
原则
不修改原有代码的前提下,可以通过增加新的实现类来实现新的功能
正反案例
反例
下面是一个违反开闭原则的例子。假设有一个类 Shape
表示图形,它有两个方法:drawCircle()
和 drawRectangle()
分别用来绘制圆形和矩形:
public class Shape {
public void drawCircle() {
// 绘制圆形
}
public void drawRectangle() {
// 绘制矩形
}
}
现在,需求变化了,需要新增一个方法 drawTriangle()
用来绘制三角形。如果直接修改原来的类,会违反开闭原则,因为修改原有代码可能会对原有功能造成影响,甚至引入新的 bug
。
正例
为了遵循开闭原则,可以采用以下方式来实现新功能:
-
定义一个抽象类
Shape
,提供一个抽象方法draw()
用于绘制图形。public abstract class Shape { public abstract void draw(); }
-
创建三个具体类
Circle
、Rectangle
和Triangle
分别实现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 接口即可
特点
- 对扩展开放:可以通过增加新的代码(比如实现类)来实现新的功能。
- 对修改关闭:不需要修改原有的代码(比如接口),从而保证原有功能的稳定性和正确性。
注意事项(*
重点)
- 在设计类的时候,要将可能会发生变化的代码抽象出来,形成抽象类或接口,并尽量让它们保持稳定,从而避免修改原有的代码。
- 在实现功能扩展的时候,尽量避免修改原有代码,而是通过增加新的代码来实现扩展。