面向对象设计原则-依赖倒置原则示例

2023-05-05 14:33:20 浏览数 (2)

假设我们有一个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原则来实现松耦合的依赖关系。通过将依赖关系定义为抽象接口,我们可以避免类之间的紧密耦合,并支持在运行时动态地传递具体实现。

0 人点赞