- 多态概念简述:
- Java多态允许不同类的对象对同一消息做出不同响应。它通过继承、接口实现以及方法重写来实现。
- 多态降低模块间耦合原理:
- 在大型模块化项目中,模块A依赖模块B的功能时,若使用多态,模块A可依赖模块B的抽象(如接口或抽象类),而非具体实现类。这样,模块A与模块B的具体实现解耦。
- 具体示例说明:
- 定义抽象:
- 首先在模块B中定义一个接口(假设为
BService
),该接口包含模块A依赖的功能方法,例如:
package moduleB;
public interface BService {
void doSomething();
}
- 模块A依赖抽象:
- 在模块A中,代码依赖
BService
接口,而不是模块B中的具体实现类。比如模块A中有一个类ModuleAClass
:
package moduleA;
import moduleB.BService;
public class ModuleAClass {
private BService bService;
public ModuleAClass(BService bService) {
this.bService = bService;
}
public void useBService() {
bService.doSomething();
}
}
- 模块B具体实现:
- 模块B中可以有多个实现
BService
接口的具体类,比如ConcreteBServiceImpl1
和ConcreteBServiceImpl2
:
package moduleB;
public class ConcreteBServiceImpl1 implements BService {
@Override
public void doSomething() {
System.out.println("ConcreteBServiceImpl1 doing something");
}
}
package moduleB;
public class ConcreteBServiceImpl2 implements BService {
@Override
public void doSomething() {
System.out.println("ConcreteBServiceImpl2 doing something");
}
}
- 灵活替换实现:
- 当需要在不改变模块A代码的情况下替换模块B的具体实现时,只需在创建
ModuleAClass
实例时传入不同的BService
实现类即可。例如:
public class Main {
public static void main(String[] args) {
// 使用ConcreteBServiceImpl1
BService service1 = new ConcreteBServiceImpl1();
ModuleAClass moduleAWithService1 = new ModuleAClass(service1);
moduleAWithService1.useBService();
// 使用ConcreteBServiceImpl2
BService service2 = new ConcreteBServiceImpl2();
ModuleAClass moduleAWithService2 = new ModuleAClass(service2);
moduleAWithService2.useBService();
}
}
- 这样,模块A无需关心模块B中具体使用哪个实现类,实现了模块间耦合度的降低,提高了系统的灵活性和可维护性。