OOP - 依赖反转原则(DIP)

823 阅读4分钟

本文是对王争大佬《设计模式之美》的学习总结

前-控制反转(IOC)

  控制反转的英文翻译是Inversion Of Control,缩写为 IOC

  框架提供了一个可扩展的代码骨架,用来组装对象、管理整个执行流程。程序员利用框架进行开发的时候,只需要往预留的扩展点上,添加跟自己业务相关的代码,就可以利用框架来驱动整个程序流程的执行。这里的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。

  控制反转并不是一种具体的实现技巧,而是一个比较笼统的设计思想,一般用来指导框架层面的设计。

前-依赖注入(DI)

  依赖注入跟控制反转恰恰相反,它是一种具体的编程技巧。依赖注入的英文翻译是 Dependency Injection,缩写为 DI。对于这个概念有一个非常形象的说法:依赖注入是一个标价25美元,实际上只值5美分的概念。也就是说,这个概念听起来很高大上,实际上理解、应用起来非常简单。我们用一句话来概括就是:不通过new()的方式在类内部创建依赖对象,而是将依赖的对象在外部创建好之后,通过构造函数、函数形参等方式传递(或注入)给类使用。

  通过依赖注入的方式来将依赖的类对象传递进来,这样就提高了代码的扩展性,我们可以灵活地替换依赖的类。

前-依赖注入框架(DI Framework)

  在实际的软件开发中,一些项目可能会涉及几十、上百、甚至几百个类,类对象的创建和依赖注入会变得非常复杂。如果这部分工作都是靠程序员自己写代码来完成,容易出错且开发成本也比较高。而对象创建和依赖的工作,本身就跟具体的业务无关,我们完全可以抽象成框架来自动完成,这个框架就是“依赖注入框架”。

  我们只需要通过依赖注入框架提供的扩展点,简单配置一下所有需要创建的类对象、类与类之间的依赖关系,就可以实现由框架来自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。

依赖反转原则 Dependency Inversion Principle (DIP)

  依赖反转的英文翻译是 Dependency Inversion Principle,缩写为 DIP,中文翻译有时候也叫依赖倒置原则。该原则最原滋原味的英文描述如下:

High-level modules shouldn't depend on low-level moduled.Both modules should depend on abstractions.In addition, abstractions shouldn't depend on details.Details depend on abstractions.

  翻译成中文大概意思是:高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块因该通过抽象(abstracttions)来互相依赖。除此之外,抽象(abstracttions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstracttions)。

  所谓高层模块和低层模块的划分,简单来说就是,在调用链上,调用者属于高层,被调用者属于低层。在实际的业务代码开发中,高层模块依赖低层模块是没有任何问题的。实际上,这条原则主要还是用来指导框架层面的设计,跟控制反转类似。

  举例:

  Tomcat 是运行 Java Web 应用程序的容器。我们编写的Web应用程序代码只需要部署在Tomcat容器下,便可以被Tomcat容器调用执行。按照之前的划分原则,Tomcat就是高层模块,我们编写的Web应用程序就是低层模块。Tomcat和应用程序代码之间没有直接的依赖关系,两者都依赖同一个抽象,也就是Servlet规范。Servlet规范不依赖具体的Tomcat容器和应用程序的实现细节,而Tomcat容器和应用程序依赖Servlet规范。