一、设计模式开闭原则定义
当应用的需求改变时,在不修改软件实体(项目模块、类、接口方法)的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。即软件实体应当对扩展开放,对修改关闭
二 、原则作用
1、对软件测试的影响
软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
2、可以提高代码的可复用性
粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
3、可以提高软件的可维护性
遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
三、原则实现实例
1、新建main.java空白文件,cursor输入指令
2、自动生成代码以及文件
2.1、Main.java代码如下:
javascript
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle(5, 10);
Circle circle = new Circle(7);
List<Shape> shapes = Arrays.asList(rectangle, circle);
AreaCalculator calculator = new AreaCalculator();
double totalArea = calculator.calculateTotalArea(shapes);
System.out.println("Total area of shapes: " + totalArea);
}
}
2.2、Shape.java接口定义方法代码如下:
Shape 接口定义了一个计算面积的方法。
javascript
public interface Shape {
double calculateArea();
}
2.3、Rectangle.java矩形计算面积类代码如下:
javascript
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height;
}
}
2.4、Circle.java方形计算圆面积类代码如下:
javascript
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
2.5、AreaCalculator类代码如下:
AreaCalculator 类可以计算任何实现了 Shape 接口的对象的面积总和
javascript
import java.util.List;
public class AreaCalculator {
public double calculateTotalArea(List<Shape> shapes) {
double totalArea = 0;
for (Shape shape : shapes) {
totalArea += shape.calculateArea();
}
return totalArea;
}
}
3、运行主程序输出
这个输出是矩形(5 10 = 50)和圆(π 7^2 ≈ 153.54)的面积之和。
这个设计是对扩展开放的(我们可以轻松添加新的形状),同时对修改是关闭的(添加新形状不需要修改现有的代码)。
这个例子展示了如何使用接口和多态性来实现开闭原则,允许我们在不修改现有代码的情况下扩展系统的功能。