Contents

依赖倒置、控制反转,依赖注入

通过定义抽象的接口,我们可以将高层应用和具体的底层模块解耦。应用程序不需要关心具体实现细节,而是通过接口来访问底层模块的功能。当需要使用不同的底层模块时,只需要实现相应的接口,然后在应用程序中传入对应的实现即可。

概念

依赖倒置

依赖倒置原则(DIP)是一种设计原则,它的定义可以总结为以下两点:

  1. 高层模块不依赖于底层模块,两者都应该依赖于抽象。
  2. 细节依赖于抽象,抽象不依赖于细节。

这个原则的目的是通过解耦高层模块和低层模块之间的依赖关系,使得高层模块不需要关心低层模块的具体实现。

控制反转

控制反转(IoC)是一种编程思想,它强调将对象之间的关系交给外部容器或框架进行管理。在控制反转中,应用程序的各个组成部分并不直接调用其他组成部分,而是由框架或容器来注入依赖关系。这个思想的目的是将对象之间的依赖关系降低到最小,从而提高系统的可维护性和可扩展性。

依赖注入

依赖注入(DI)是控制反转的一种实现方式,它指的是在创建一个对象时,将其所依赖的其他对象通过构造函数、方法参数、属性等方式传递进去。通过依赖注入,我们可以将对象之间的关系从代码中硬编码的方式,改为由外部容器或框架动态地注入依赖关系,从而提高代码的可测试性和可维护性。

举例

// 抽象接口
class Database {
  constructor() {}
  getData() {}
}

// 具体实现类
class MySQL extends Database {
  getData() {
    return 'Data from MySQL';
  }
}

// 具体实现类
class Oracle extends Database {
  getData() {
    return 'Data from Oracle';
  }
}

// 高层模块,在创建 Application 的实例时,我们可以传入任何实现了 Database 接口的对象,从而达到了高层模块和具体实现之间的解耦。
class Application {
  constructor(database) {
    this.database = database;
  }
  getData() {
    console.log(this.database.getData());
  }
}

// 应用程序入口,利用依赖注入实现控制反转。
const mySQL = new MySQL();
const oracle = new Oracle();
const app1 = new Application(mySQL);
const app2 = new Application(oracle);

app1.getData(); // 输出:Data from MySQL
app2.getData(); // 输出:Data from Oracle