控制反转(IOC)介绍

98 阅读3分钟

IOC 概念

IOC 全称(Inversion of control), 是一种设计思想。其本质是为复杂的程序提供解耦的思想。

IOC 意义

IOC 讨论的核心是谁控制谁。
在以往的开发中,应用程序负责流程的调用,以及不同场景的业务支持。
IOC 则是通过容器(框架)来控制流程,提供不同的扩展点槽位。应用程序则负责实现扩展点。
类似于做填空题,容器完成大致的内容,应用程序完成题目的填空。
通过场景来描述:用户去买不同品类的商品。

传统的过程
用户需要去不同的店铺购买不同种类的商品

image.png

IOC 方式
用户从购物平台获取所需的不同种类的商品,平台负责从不同的店铺拿商品

image.png

IOC 如何实现

  1. 依赖注入(DI)
  2. 依赖查找(DL)

依赖查找

依赖查找(Dependency Lookuo)简称 DL
容器内部的受控对象通过容器的 API 查找自己依赖的资源与对象,这种虽然也变相的降低了耦合,同时因为使用了容器内的 API 导致我们无法在容器外部进行使用和测试。比较传统的 IOC 实现方式。

依赖注入

依赖注入(Dependency Injection) 简称 DI
依赖」是指接收方所需的对象。
注入」是指将『依赖』传递给接收方的过程。
通过将类所依赖的对象传递进类中,灵活的替换类中所依赖的对象,提高类的复用性,实现关注点分离,达到解耦的目的。
举例:
未使用依赖注入

class Goods {
    id = 123
}
class PlantForm {
    good;
    constructor(){
        good = new Goods();
    };
    getGood(){
        return this.good
  }
}


此时如果需求改变了,平台换产品了,从产品 A 换成 产品 B,此时我们需要在 PlantForm 这个类中重新 new 一个新的产品。

依赖注入方案

class PlantForm {
   good;
  constructor(params){
      this.good = params
  };
  getGood(){
    return this.good
  }
}

class Goods {
  id = 123;
}

let goodsType = new PlantForm(new Goods());

此时,即使替换了不同的产品,我们可以直接在应用中修改注入的依赖对象,PlantForm 这个类或无需有任何改变。

依赖反转原则

依赖反转原则(Dependency Inversion Principle
核心概念: 高层的模块不应该依赖于底层的模块。
高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。

每次抽象模块的变动一定涉及底层具体实现的变化,但是具体逻辑的变化并不一定涉及抽象模块的变化,因此我们称抽象模块相对稳定,通过这种设计方法,实现弱耦合关系。

image.png

A 对象中直接使用底层 B 对象。 使用依赖反转原则后: A 对象中使用 接口的定义 interfaceA。 底层 B 对象负责接口的实现。