MST

星途 面试题库

面试题:Java项目中依赖反转与设计模式的结合

在一个Java企业级项目中,依赖反转原则常与哪些设计模式配合使用,以优化系统架构?请举例说明其中一种结合方式在代码层面的具体实现,阐述其优势和适用场景。
29.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 常配合的设计模式
    • 工厂模式:工厂模式负责创建对象,依赖反转原则强调对象依赖的抽象。通过工厂模式创建具体对象,而对象间依赖基于抽象,实现解耦。例如,在一个电商系统中,商品服务的创建可以由商品工厂创建,其他模块依赖商品服务的抽象接口,而不是具体的实现类。
    • 代理模式:代理模式用于为其他对象提供一种代理以控制对这个对象的访问。在依赖反转原则下,代理对象可作为依赖对象的抽象代表,使得依赖方与被依赖方解耦。比如在远程服务调用中,代理对象可以代替真实的远程服务对象,调用方依赖代理对象的抽象接口,符合依赖反转原则。
    • 策略模式:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。依赖反转原则要求依赖抽象而非具体实现,策略模式中,不同的策略实现类实现相同的抽象策略接口,使用策略的对象依赖这个抽象接口,达到依赖反转。例如在支付系统中,不同的支付策略(如微信支付、支付宝支付)实现支付抽象接口,订单系统依赖支付抽象接口,可根据需要切换不同支付策略。
  2. 以工厂模式与依赖反转原则结合为例的代码实现
    • 定义抽象接口
// 定义商品服务接口
public interface ProductService {
    void showProduct();
}
  • 实现具体接口类
// 具体的商品服务实现类
public class DefaultProductService implements ProductService {
    @Override
    public void showProduct() {
        System.out.println("展示默认商品");
    }
}
  • 创建工厂类
// 商品服务工厂类
public class ProductServiceFactory {
    public static ProductService createProductService() {
        return new DefaultProductService();
    }
}
  • 使用依赖反转和工厂模式
public class MainApp {
    private ProductService productService;

    // 通过构造函数注入,体现依赖反转
    public MainApp(ProductService productService) {
        this.productService = productService;
    }

    public void displayProduct() {
        productService.showProduct();
    }

    public static void main(String[] args) {
        // 使用工厂创建商品服务对象,并注入到MainApp中
        ProductService productService = ProductServiceFactory.createProductService();
        MainApp app = new MainApp(productService);
        app.displayProduct();
    }
}
  1. 优势
    • 解耦依赖关系:通过依赖抽象接口和工厂创建对象,使得对象间的依赖关系更加松散,修改具体实现类(如更换商品服务实现)不会影响到依赖它的对象(如MainApp)。
    • 提高可维护性和可扩展性:当需要添加新的商品服务实现时,只需修改工厂类的创建逻辑,依赖方代码无需改动。例如添加一个高级商品服务实现类,在工厂类中添加创建该类的逻辑,MainApp等依赖方无需修改代码。
  2. 适用场景
    • 对象创建复杂的场景:如电商系统中商品服务的创建可能涉及到数据库连接、配置加载等复杂操作,通过工厂模式封装这些操作,依赖方只需获取抽象服务接口。
    • 需要频繁切换具体实现的场景:在一个多主题的应用程序中,主题服务可以通过工厂创建,根据用户设置切换不同主题的具体实现,依赖方始终依赖主题服务的抽象接口,不受具体主题实现变化的影响。