面试题答案
一键面试依赖反转原则应用场景描述
假设我们有一个邮件发送功能,在一个应用程序中,不同的业务模块可能需要发送邮件。传统方式下,业务模块可能会直接创建邮件发送对象并调用发送方法。但如果我们采用依赖反转原则,业务模块不再负责创建邮件发送对象,而是由外部提供这个对象。这样可以提高代码的可测试性、可维护性以及可扩展性。例如,在开发一个电商系统时,用户下单后需要发送确认邮件,我们可以将邮件发送功能独立出来,通过依赖反转原则让下单模块依赖于邮件发送接口,而不是具体的邮件发送实现类。
代码示例
- 定义邮件发送接口
public interface EmailSender {
void sendEmail(String to, String subject, String content);
}
- 实现邮件发送接口
public class DefaultEmailSender implements EmailSender {
@Override
public void sendEmail(String to, String subject, String content) {
System.out.println("Sending email to " + to + " with subject: " + subject + " and content: " + content);
}
}
- 使用依赖注入实现依赖反转
public class OrderService {
private EmailSender emailSender;
// 通过构造函数进行依赖注入
public OrderService(EmailSender emailSender) {
this.emailSender = emailSender;
}
public void placeOrder(String customerEmail) {
// 下单逻辑
System.out.println("Order placed successfully.");
// 发送邮件通知
emailSender.sendEmail(customerEmail, "Order Confirmation", "Your order has been placed successfully.");
}
}
- 测试代码
public class Main {
public static void main(String[] args) {
EmailSender emailSender = new DefaultEmailSender();
OrderService orderService = new OrderService(emailSender);
orderService.placeOrder("customer@example.com");
}
}
在上述代码中,OrderService
类依赖于EmailSender
接口,而不是具体的DefaultEmailSender
类。通过构造函数注入,OrderService
不需要知道具体的邮件发送实现,从而实现了依赖反转原则。这样如果我们需要更换邮件发送方式,只需要创建一个新的EmailSender
实现类,并通过依赖注入传入OrderService
即可,而不需要修改OrderService
的代码。