SOLID原则中的剩余三个原则是依赖倒置原则(Dependency Inversion Principle, DIP)、接口隔离原则(Interface Segregation Principle, ISP)和合成复用原则(Composite Reuse Principle, CRP)。以下是这些原则的Java代码示例:
依赖倒置原则(DIP)
依赖倒置原则指出高层模块不应依赖于低层模块,二者都应该依赖于抽象(接口或抽象类)。抽象不应依赖于细节,细节应依赖于抽象。
public interface Shape {
double area();
}
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 ShapeCalculator {
public double calculateArea(Shape shape) {
return shape.area();
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
ShapeCalculator calculator = new ShapeCalculator();
double area = calculator.calculateArea(circle);
System.out.println("Area: " + area);
}
}
接口隔离原则(ISP)
接口隔离原则主张不应该强迫客户依赖于它们不使用的方法。一个类对一个接口的依赖应该尽可能少。
public interface Vehicle {
void start();
void stop();
}
public interface Drivable {
void drive();
}
public interface Parkable {
void park();
}
// 现在我们可以根据不同的需求实现不同的接口
public class Car implements Drivable, Parkable {
@Override
public void drive() {
System.out.println(“Car is driving”);
}
@Override
public void park() {
System.out.println("Car is parked");
}
}
public class Boat implements Drivable {
@Override
public void drive() {
System.out.println(“Boat is sailing”);
}
}
合成复用原则(CRP)
合成复用原则提倡优先使用对象的组合,而不是通过继承来复用代码。
public class Component {
public void doWork() {
// 基本工作
}
}
public class Decorator extends Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void doWork() {
component.doWork();
// 增加额外功能
}
}
public class EnhancedComponent extends Decorator {
public EnhancedComponent(Component component) {
super(component);
}
@Override
public void doWork() {
super.doWork();
// 进一步增强功能
}
}
public class Main {
public static void main(String[] args) {
Component basicComponent = new Component();
Component enhancedComponent = new EnhancedComponent(basicComponent);
enhancedComponent.doWork(); // 组合基本功能和增强功能
}
}
在这些示例中:
依赖倒置原则通过使用接口Shape来允许ShapeCalculator类对具体实现类Circle的解耦。
接口隔离原则通过将Vehicle接口拆分为Drivable和Parkable接口,使得Car和Boat类只需实现它们需要的功能。
合成复用原则通过使用装饰者模式(Decorator类)来展示如何通过组合来复用Component类的功能,而不是通过继承。