Java接口与抽象类在依赖注入场景下的选择
- 选择Java接口
- 适用场景:当多个不相关的类需要实现相同的行为,或者需要实现多继承(Java单继承限制)时,适合使用接口。例如,在电商系统中,不同类型的支付方式(支付宝、微信支付等)可能都需要实现支付的基本行为,此时可以定义一个支付接口。
- 优势:
- 灵活性高,一个类可以实现多个接口,实现更灵活的功能组合。
- 有利于实现松耦合,接口的实现类可以随时替换,不影响依赖它的其他类。
- 选择抽象类
- 适用场景:当存在一些共性的属性或方法,子类有共同的基础实现,并且需要限制继承体系时,适合使用抽象类。比如在图形绘制系统中,不同的图形(圆形、矩形等)可能都有一些共同的属性(颜色等)和方法(绘制方法的部分通用逻辑),可以定义一个抽象图形类。
- 优势:
- 可以包含部分已经实现的方法,避免子类重复实现,提高代码复用性。
- 限制继承体系,使得继承关系更加清晰。
在Spring中的应用
- Java接口在Spring中的示例
public interface PaymentService {
void pay(double amount);
}
@Component
public class AlipayService implements PaymentService {
@Override
public void pay(double amount) {
System.out.println("使用支付宝支付:" + amount + "元");
}
}
@Component
public class OrderService {
private PaymentService paymentService;
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void placeOrder(double amount) {
System.out.println("下单金额:" + amount + "元");
paymentService.pay(amount);
}
}
- 抽象类在Spring中的示例
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
public abstract void draw();
}
@Component
public class Circle extends Shape {
public Circle(String color) {
super(color);
}
@Override
public void draw() {
System.out.println("绘制" + color + "的圆形");
}
}
@Component
public class DrawingService {
private Shape shape;
public DrawingService(Shape shape) {
this.shape = shape;
}
public void drawShape() {
shape.draw();
}
}