博客
关于我
设计模式—— 三:依赖倒置原则
阅读量:578 次
发布时间:2019-03-11

本文共 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://usptz.baihongyu.com/

    你可能感兴趣的文章
    权值初始化和与损失函数
    查看>>
    案例讨论
    查看>>
    传输层基本功能
    查看>>
    问题的计算复杂度:排序问题
    查看>>
    算法的伪码表示
    查看>>
    递推方程与算法分析
    查看>>
    主定理的应用
    查看>>
    动态规划算法的迭代实现
    查看>>
    最优装载问题
    查看>>
    最大团问题
    查看>>
    圆排列问题
    查看>>
    课程总结
    查看>>
    认识CMake及应用
    查看>>
    CMake的主体框架
    查看>>
    微积分(三)
    查看>>
    Oracle
    查看>>
    软件工程应用
    查看>>
    数据科学
    查看>>
    论文报告/前沿文章
    查看>>
    函数与高级变量
    查看>>