IOC 概念
IOC 全称(Inversion of control), 是一种设计思想。其本质是为复杂的程序提供解耦的思想。
IOC 意义
IOC 讨论的核心是谁控制谁。
在以往的开发中,应用程序负责流程的调用,以及不同场景的业务支持。
IOC 则是通过容器(框架)来控制流程,提供不同的扩展点槽位。应用程序则负责实现扩展点。
类似于做填空题,容器完成大致的内容,应用程序完成题目的填空。
通过场景来描述:用户去买不同品类的商品。
传统的过程
用户需要去不同的店铺购买不同种类的商品
IOC 方式
用户从购物平台获取所需的不同种类的商品,平台负责从不同的店铺拿商品
IOC 如何实现
- 依赖注入(DI)
- 依赖查找(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)
核心概念: 高层的模块不应该依赖于底层的模块。
高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
每次抽象模块的变动一定涉及底层具体实现的变化,但是具体逻辑的变化并不一定涉及抽象模块的变化,因此我们称抽象模块相对稳定,通过这种设计方法,实现弱耦合关系。
A 对象中直接使用底层 B 对象。
使用依赖反转原则后: A 对象中使用 接口的定义 interfaceA。 底层 B 对象负责接口的实现。