02_IOC控制反转 DI依赖注入

简介: 02_IOC控制反转 DI依赖注入
  1. 依赖倒置(Dependence Inversion Principle,DIP)是指高层模块不应该依赖底层模块,两者都应该依赖其抽象。 同时,抽象不应该依赖细节,细节应该依赖抽象。简单来说,就是依赖抽象,而不是依赖具体实现。比如Class A 依赖 Class B,这是直接依赖,如果Class A依赖 interface B,而Class B实现了interface B,这就是依赖倒置了
  2. 控制反转(Inversion of Control,IoC)也是一种面向对象编程的设计原则,它通过反转调用方和被调用方之间的关系,实现解耦合。 比如Class A 依赖 Class B,在A内部实例化了B。这样两个类就耦合在一起,如果是通过外部实例化B,然后在注入到A中,这样A和B就解除了耦合
  3. 依赖注入(Dependency Injection,DI)则是一种实现控制反转的方式,通过将被依赖对象的创建和管理由依赖方转移到外部容器(或者框架),然后将依赖的对象注入到需要使用的地方,实现解耦合。 在依赖注入中,组件不会自己创建或管理它所依赖的对象,而是由外部的组件将依赖的对象注入到它的构造函数、属性或方法中。
class A {
  name: string
  constructor() {
    this.name = '小满'
  }
}
class B {
  name: string
  constructor() {
    this.name = new A().name
  }
}
class C {
  name: string
  constructor() {
    this.name = new A().name
  }
}

如图,如果我们尝试修改A类使其name变为用户输入的值时,B类和C类都必须修改,它们是强耦合的

接下来我们用一个容器Container来统一管理依赖,Container中有两个方法provide和get用于收集和注入依赖,B类通过Container对象将依赖注入到自己身上

如图,这样一来就实现了类A和类B的解耦,即是我们所讲的“控制反转”,在这种情况下,直接修改A类将不再导致B类报错,也可以很方便地扩展其他类

完整代码:

// A类(被依赖的类)
class A {
  name: string
  constructor(name: string) {
    this.name = name
  }
}
// Container
class Container {
  mo: any
  constructor() {
    this.mo = {}
  }
  // 收集依赖
  provide(key: string, mo: any) {
    this.mo[key] = mo
  }
  // 注入依赖
  get(key: string) {
    return this.mo[key]
  }
}
const mo = new Container()
// 注册依赖
mo.provide('a', new A('小满啪啪啪'))
mo.provide('b', new A('小满哈哈哈'))
// 需要依赖A类
class B {
  a: any
  b: any
  // 依赖注入
  constructor(mo: Container) {
    this.a = mo.get('a')
    this.b = mo.get('b')
  }
}
const b = new B(mo)
console.log(b)
B { a: A { name: '小满啪啪啪' }, b: A { name: '小满哈哈哈' } }
目录
相关文章
|
设计模式 前端开发 Java
javaweb实训第四天上午——员工管理系统-JavaBean&EL&JSTL&MVC思想(3)
5.2.怎么使用JSTL标签库 第一步:导入相关的jar包
208 0
|
存储 C++
C++循环结构
C++循环结构
211 1
|
存储 NoSQL 大数据
大数据存储:HBase与Cassandra的对比
【7月更文挑战第16天】HBase和Cassandra作为两种流行的分布式NoSQL数据库,在数据模型、一致性模型、数据分布、查询语言和性能等方面各有千秋。HBase适用于需要强一致性和与Hadoop生态系统集成的场景,如大规模数据处理和分析。而Cassandra则更适合需要高可用性和灵活查询能力的场景,如分布式计算、云计算和大数据应用等。在实际应用中,选择哪种数据库取决于具体的需求和场景。希望本文的对比分析能够帮助读者更好地理解这两种数据库,并做出明智的选择。
1190 1
|
Linux 网络安全 数据安全/隐私保护
centos7安装gitlab-ce社区版全过程,详细到爆炸,这些面试官常问的开发面试题你都掌握好了吗
centos7安装gitlab-ce社区版全过程,详细到爆炸,这些面试官常问的开发面试题你都掌握好了吗
|
算法 测试技术 开发者
测试驱动开发(TDD)实战:从理论到实践
【5月更文挑战第8天】TDD实战指南:先测试后开发,确保代码质量与可维护性。核心思想是编写测试用例→实现代码→验证→重构。优点包括提高代码质量、促进设计思考和增强可测试性。实战步骤包括编写独立、明确的测试用例,遵循最小可用原则编写代码,运行测试并分析失败原因,以及在验证通过后进行代码重构与优化。通过TDD,开发者能提升编程技能和项目成功率。
1081 3
|
人工智能 搜索推荐 安全
智能家居技术的未来展望
在这篇文章中,我们将探讨智能家居技术的最新发展趋势和未来的可能性。从人工智能的集成到物联网设备的互联互通,我们将看到这些技术如何改变我们的生活空间,使其变得更加智能、高效和便捷。文章将深入分析智能家居技术的各个方面,包括其优势、挑战以及未来的发展方向。
158 27
|
SQL 网络协议 前端开发
🚀超级简单的图解TCP/IP,看不懂来打我:OSI模型与通信示例🚀
🚀超级简单的图解TCP/IP,看不懂来打我:OSI模型与通信示例🚀
|
Linux 数据安全/隐私保护 存储
Linux 下zip包的压缩与解压
范例:   zip命令可以用来将文件压缩成为常用的zip格式。unzip命令则用来解压缩zip文件。   1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:   # zip -r yasuo.
8096 0
|
Web App开发 数据可视化 安全
关于 Chrome (谷歌浏览器)升级到 80 后可能产生的影响以及解决方案
### 背景 Google 将在2020年**2月4号**发布的 Chrome 80 版本(schedule:[https://www.chromestatus.com/features/schedule](https://www.
45577 152
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
188 0