面试题答案
一键面试设计思路
- 定义桥接接口:
- 首先在模块A和模块B之间定义一个桥接接口,假设命名为
ModuleBInterface
。这个接口定义了模块A依赖模块B的功能方法。例如,如果模块A需要模块B提供数据处理功能,接口中可以定义processData()
方法。
public interface ModuleBInterface { void processData(); }
- 首先在模块A和模块B之间定义一个桥接接口,假设命名为
- 实现类:
- 模块B根据其可能的多种实现方式,创建实现
ModuleBInterface
的具体实现类。比如有ModuleBImpl1
和ModuleBImpl2
两个实现类。
public class ModuleBImpl1 implements ModuleBInterface { @Override public void processData() { // 具体的数据处理实现1 System.out.println("ModuleBImpl1 is processing data."); } }
public class ModuleBImpl2 implements ModuleBInterface { @Override public void processData() { // 具体的数据处理实现2 System.out.println("ModuleBImpl2 is processing data."); } }
- 模块B根据其可能的多种实现方式,创建实现
- 依赖注入的方式:
- 在模块A中,通过构造函数注入、Setter方法注入或字段注入的方式将
ModuleBInterface
的实现类注入进来。以构造函数注入为例:
public class ModuleA { private ModuleBInterface moduleB; public ModuleA(ModuleBInterface moduleB) { this.moduleB = moduleB; } public void doSomething() { moduleB.processData(); } }
- 在使用模块A的地方,根据实际需求选择合适的
ModuleBInterface
实现类进行注入。
public class Main { public static void main(String[] args) { ModuleBInterface moduleB = new ModuleBImpl1(); ModuleA moduleA = new ModuleA(moduleB); moduleA.doSomething(); } }
- 在模块A中,通过构造函数注入、Setter方法注入或字段注入的方式将
- 优势:
- 解耦抽象和实现:模块A只依赖于
ModuleBInterface
,而不依赖于具体的模块B实现类,使得模块A和模块B的具体实现可以独立变化。例如,如果模块B有新的实现方式,只需要创建新的实现ModuleBInterface
的类,而模块A不需要修改。 - 提高可维护性和可扩展性:当模块B的功能需要修改或增加新功能时,只需要在实现类中进行修改或添加,不会影响到模块A。同时,通过依赖注入,可以方便地替换模块B的实现,以适应不同的业务场景。
- 增强代码复用性:不同的模块可以复用
ModuleBInterface
及其实现类,只要这些模块有对模块B功能的类似需求。
- 解耦抽象和实现:模块A只依赖于