依赖倒置原则(DIP)

依赖倒置原则(DIP)

SOLID 原则系列,第 5 部分

Photo by 艾尔莎·冈萨雷斯 on 不飞溅

什么是 DIP?

依赖倒置原则是所有 SOLID 原则中最令人困惑的定义之一。维基百科相对用户友好的定义指出:

高级模块不应该从低级模块导入任何东西。两者都应该依赖于抽象(例如,接口)。

抽象不应该依赖于细节。细节(具体实现)应该依赖于抽象。

什么是高级模块与低级模块?为什么他们使用通用术语“抽象”来指代接口?究竟什么才是细节?

服务器示例

一个例子将有助于说明。想象一个服务器,它的工作是接收某种请求并返回某种响应。

有时,它会像 Echo Server 一样,接收请求并在响应中“回显”相同的确切文本。

Echo Server Implementation

其他时候,它就像一个 HTTP 服务器。您可以请求对资源执行某些操作(例如,获取电子书、在 Instagram 上发布、删除您的帖子),它会为您执行此操作,然后您会收到回复。

HTTP Server Implementation

高级与低级

服务器调用 HTTPServer 或 EchoServer 来确定要执行哪种类型的服务器实现。该图显示了程序结构。

服务器是高级模块的一个线索是它代表“服务器”的总类,而其他类代表该类别中的类型。它首先出现在调用堆栈中的事实提供了另一个线索。

HTTPServer 和 EchoServer 是低级模块,因为它们处理不同类型服务器如何工作的“细节”。

依赖方向

目前,高级模块(服务器)依赖于低级实现细节(HTTPServer 和 EchoServer)。它知道它们是什么以及需要如何调用它们。

这是一种形式 耦合 ,当发生变化时会导致困难。较低级别的细节比较高级别的抽象更有可能发生变化。如果(以及何时)HTTPServer 或 EchoServer 发生变化,它可能会影响服务器并意味着您需要做更多的工作。

反转依赖

为了反转依赖关系,您可以创建一个接口(即“抽象”)来隐藏服务器的实现细节。

现在,Server 依赖于 Application 接口。 HTTPServer 和 EchoServer 也都依赖于相同的接口。 Server、HTTPServer 和 EchoServer 都同意定义它们相互交互方式的“合同”。请注意,此图中的依赖关系箭头指向彼此。

服务器只需要知道应用程序接口。它可以接收实现该接口的任何类型的服务器(Echo、HTTP、CatPicture 等)。每种类型的服务器实现的功能以及如何实现的详细信息对高级服务器隐藏。

回顾

反转依赖关系减少了耦合,这使得设计在面对变化时更加健壮。当您使用接口隐藏实现细节时,更改不会那么痛苦,因为它不会冒泡到程序的高级部分。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/24388/17321008

posted @ 2022-09-10 08:19  哈哈哈来了啊啊啊  阅读(73)  评论(0编辑  收藏  举报