一些简单实用的小设计(6),控制反转,IoC(Inversion of Control)

主题

一些简单实用的小设计(6),控制反转,IoC(Inversion of Control)

什么是控制反转

IoC 可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在 GoF 中。

依赖倒置原则(DIP: 一种软件架构设计的原则(抽象概念)。

控制反转(IoC: 一种反转流、依赖和接口的方式(DIP 的具体实现方式)。

依赖注入(DI: IoC的一种实现方式,用来反转依赖(IoC 的具体实现方式)。

IoC 容器: 依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI 框架)。

可以说,有:

graph LR
    DIP[DIP]
    IoC(IoC)
    DI(DI)
    IoCC{Ioc容器}
    DIP-->IoC
    IoC-->DI
    DI-->IoCC

依赖倒置原则,它转换了依赖,高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口。通俗的讲,就是高层模块定义接口,低层模块负责实现。

Bob MartinsDIP 的定义:
高层模块不应依赖于低层模块,两者应该依赖于抽象。
抽象不应该依赖于实现,实现应该依赖于抽象。

以例子说明,

类图1

从上图中,我们发现高层模块的类依赖于低层模块的接口。因此,低层模块需要考虑到所有的接口。如果有新的低层模块类出现时,高层模块需要修改代码,来实现新的低层模块的接口。这样,就破坏了开放封闭原则。

类图2

在这个图中,我们发现高层模块定义了接口,将不再直接依赖于低层模块,低层模块负责实现高层模块定义的接口。这样,当有新的低层模块实现时,不需要修改高层模块的代码。

由此,我们可以总结出使用 DIP 的优点:

系统更柔韧: 可以修改一部分代码而不影响其他模块。

系统更健壮: 可以修改一部分代码而不会让系统崩溃。

系统更高效: 组件松耦合,且可复用,提高开发效率。

我们常用的 Spring,就是一个轻量型 IoC 容器。

小结

实际上,我们在开发中,可以考虑自己的业务设计是不是能启用这类设计模式。