设计模式—— 三:依赖倒置原则
发布日期:2021-05-14 17:35:20 浏览次数:9 分类:精选文章

本文共 2070 字,大约阅读时间需要 6 分钟。

什么是依赖倒置原则?

定义解析

依赖倒置原则(Dependency Inversion Principle, DIP)提出的核心思想是:高层模块不应直接依赖底层模块,而是通过抽象(接口或抽象类)间接建立依赖关系。具体定义如下:

  • 高层模块不应直接依赖低层模块,两者都应依赖于抽象;
  • 抽象不应直接依赖具体实现类
  • 具体实现类应依赖于抽象
    这是软件设计的三大核心原则之一,广泛应用于模块化设计、合成设计以及复用设计等场景中。
  • 依赖倒置原则的意义

    一、降低耦合度:通过抽象层隔离具体实现,减少模块间的紧密联系,避免因模块改动而导致的广泛影响。

    二、提升系统稳定性:系统各部分相对独立,便于扩展与维护。
    三、便于并发开发:高层模块与低层模块分离,减少沟通冲突。

    案例分析——从陆龆开叉到依赖注入

    一个典型的Java场景:司机驾驶不同品牌车辆。

  • 初始实现:直接耦合

    • Benz.java:```java
      public class Benz {
      public void run() { System.out.println("奔驰开始..."); }``
    • Driver.java:```java
      public class Driver {
      public void drive(Benz benz) { benz.run(); }``
    • 问题:扩展性差,新增车型需要修改Driver.java。
  • 引入依赖倒置原则:通过接口实现解耦

    • 定义接口
      public interface ICar {      void run();  }
    • 司机接口
      public interface IDriver {      void drive(ICar car);  }
    • 司机实现类
      public class Driver implements IDriver {      public void drive(ICar car) {          car.run();      }
    • 车型实现类
      public class Benz implements ICar {      public void run() { System.out.println("奔驰开始..."); }}public class BMW implements ICar {      public void run() { System.out.println("宝马开始..."); }}
    • 场景类:```java
      public class Client {
      public static void main(String[] args) {
      IDriver driver = new Driver();
      ICar benz = new Benz();
      driver.drive(benz);
      ICar bmw = new BMW();
      driver.drive(bmw);
      }}
  • #### 依赖注入的三种方式

    在Java中,依赖注入是实现依赖倒置的核心技术,主要方法有:

  • ** constructor injection(构造函数注入)**:通过无参数构造函数接收依赖对象。

    • 适用于对依赖注入较为简单的场景。
  • ** setter injection(Setter注入)**:通过Setter方法注入依赖对象。

    • 适用于对依赖类型较为确定的场景。
  • ** interface injection(接口注入)**:在接口中定义依赖关系,实现类只需实现接口即可。

    • 无需显式传递依赖对象,依赖关系从接口实现得到。
  • 实现示例:接口注入的方式

    // definitionspublic interface ICar { void run(); }public interface IDriver { void drive(ICar car); }// implementationspublic class Benz implements ICar {      public void run() { System.out.println("奔驰开始..."); }}public class BMW implements ICar {      public void run() { System.out.println("宝马开始..."); }}public class Driver implements IDriver {      public void drive(ICar car) {          car.run();      }}

    优化后的思考维度

    • 避免不变更原则:只有高层模块需要修改,低层模块保持不变。
    • 易于扩展:新增车型只需实现对应接口,无需修改司机类。
    • 降低风险:降低并发开发冲突的概率,提高开发效率。

    结语

    通过依赖倒置原则和依赖注入技术,可以显著提升系统设计的可维护性与扩展性。在实际开发中,这三种注入方式可以根据具体场景灵活选择,以实现最佳性与可读性。

    上一篇:设计模式—— 四:接口隔离原则
    下一篇:浪漫故事:常见HTTP状态码的另类解析

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月30日 07时22分51秒