假设我们有一个Report类,它用于生成报告。我们可以定义一个IReportGenerator接口来定义Report类的依赖关系:
代码语言:javascript复制public interface IReportGenerator {
void generate();
}
然后,我们可以定义一个HtmlReportGenerator类和一个PdfReportGenerator类,它们都实现了IReportGenerator接口:
代码语言:javascript复制public class HtmlReportGenerator implements IReportGenerator {
public void generate() {
// 生成HTML格式的报告
}
}
public class PdfReportGenerator implements IReportGenerator {
public void generate() {
// 生成PDF格式的报告
}
}
现在,我们可以定义一个ReportService类,它依赖于IReportGenerator接口:
代码语言:javascript复制public class ReportService {
private IReportGenerator reportGenerator;
public ReportService(IReportGenerator reportGenerator) {
this.reportGenerator = reportGenerator;
}
public void generateReport() {
reportGenerator.generate();
}
}
在上面的代码中,ReportService类依赖于IReportGenerator接口,而IReportGenerator的具体实现通过构造函数注入到ReportService类中。这样,我们就可以在运行时动态地传递IReportGenerator的具体实现,而不需要在ReportService类中硬编码依赖关系。
现在,我们可以在客户端代码中创建ReportService类的实例,并将HtmlReportGenerator或PdfReportGenerator的实例作为参数传递进去:
代码语言:javascript复制public class Client {
public static void main(String[] args) {
IReportGenerator reportGenerator = new HtmlReportGenerator();
ReportService reportService = new ReportService(reportGenerator);
reportService.generateReport();
}
}
在上面的代码中,我们创建了一个HtmlReportGenerator的实例,并将其作为参数传递给ReportService的构造函数。这样,当我们调用ReportService的generateReport方法时,它将使用HtmlReportGenerator来生成报告。
这个例子说明了如何使用DIP原则来实现松耦合的依赖关系。通过将依赖关系定义为抽象接口,我们可以避免类之间的紧密耦合,并支持在运行时动态地传递具体实现。