深入理解依赖倒置原则,java演示
时间: 2023-10-17 11:24:39 浏览: 41
依赖倒置原则(DIP)是面向对象设计中的一个重要原则,它指导我们在设计时要遵循高层模块不依赖于底层模块的具体实现,而是通过抽象接口进行通信,从而实现模块间的解耦。
下面我们通过一个 Java 代码演示来深入理解依赖倒置原则。
假设我们有一个图形类 `Shape`,它有两个子类 `Rectangle` 和 `Circle`,并且我们需要一个类 `AreaCalculator` 来计算这些图形的面积。一开始我们可能会这样设计代码:
```java
public abstract class Shape {
public abstract double area();
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
public class AreaCalculator {
public double calculate(Shape[] shapes) {
double totalArea = 0;
for (Shape shape : shapes) {
totalArea += shape.area();
}
return totalArea;
}
}
```
上述代码实现了我们的需求,但是我们发现 `AreaCalculator` 类直接依赖于 `Shape` 类及其子类的具体实现,这违反了依赖倒置原则,因为高层模块 `AreaCalculator` 依赖于底层模块 `Shape` 的具体实现。
为了遵循依赖倒置原则,我们需要通过抽象接口来解耦 `AreaCalculator` 和 `Shape`:
```java
public interface Shape {
double area();
}
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 area() {
return width * height;
}
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
public class AreaCalculator {
public double calculate(Shape[] shapes) {
double totalArea = 0;
for (Shape shape : shapes) {
totalArea += shape.area();
}
return totalArea;
}
}
```
现在我们将 `Shape` 抽象成一个接口,`Rectangle` 和 `Circle` 类实现这个接口,并且 `AreaCalculator` 类只依赖于 `Shape` 接口,而不是具体的实现类,这样就做到了高层模块不依赖于底层模块的具体实现的目的。
总结一下,依赖倒置原则是面向对象设计中非常重要的原则之一,遵循依赖倒置原则可以使我们的设计更加灵活、可扩展和易于维护。