依赖反转原则

✍ dations ◷ 2025-12-08 09:30:25 #软件设计模式,软件设计,编程原则,面向对象的程序设计

在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

该原则规定:

该原则颠倒了一部分人对于面向对象设计的认识方式。如高层次和低层次对象都应该依赖于相同的抽象接口。

在传统的应用架构中,低层次的组件设计用于被高层次的组件使用,这一点提供了逐步的构建一个复杂系统的可能。在这种结构下,高层次的组件直接依赖于低层次的组件去实现一些任务。这种对于低层次组件的依赖限制了高层次组件被重用的可行性。

依赖反转原则的目的是把高层次组件从对低层次组件的依赖中解耦出来,这样使得重用不同层级的组件实现变得可能。把高层组件和低层组件划分到不同的包/库(在这些包/库中拥有定义了高层组件所必须的行为和服务的接口,并且存在高层组件的包)中的方式促进了这种解耦。由于低层组件是对高层组件接口的具体实现,因此低层组件包的编译是依赖于高层组件的,这颠倒了传统的依赖关系。众多的设计模式,比如插件,服务定位器或者依赖反转,则被用来在运行时把指定的低层组件实现提供给高层组件。

应用依赖反转原则同样被认为是应用了适配器模式,例如:高层的类定义了它自己的适配器接口(高层类所依赖的抽象接口)。被适配的对象同样依赖于适配器接口的抽象(这是当然的,因为它实现了这个接口),同时它的实现则可以使用它自身所在低层模块的代码。通过这种方式,高层组件则不依赖于低层组件,因为它(高层组件)仅间接的通过调用适配器接口多态方法使用了低层组件,而这些多态方法则是由被适配对象以及它的低层模块所实现的。

另一个例子是台灯和按钮的例子。

依赖反转原则由罗伯特·C·马丁(英语:Robert Cecil Martin)提出,并且在数篇公开著作中被表述,包括论文《面向对象设计质量标准:对于依赖的分析》,以及一篇1996年出现在C++报道中的名为《依赖反转原则》的文章,和《敏捷软件开发,原则,模式和实践》,《C#中的敏捷原则,模式和实践》两本书。


相关

  • 杆状核粒细胞杆状核粒细胞(英语:band cell、band neutrophil、stab cell)是一种正在骨髓进行粒细胞生成(英语:granulopoiesis)的粒细胞前体,也会被释出到血液中,由晚幼粒细胞(metamyelocyte)发育而
  • 心理成熟心理成熟是指心理指随着时间的推移向着圆满生长,有能力以恰当的方式对社会环境做出适当反应。反应通常而言是靠学习而得到的,而非先天本能。成熟也意味着根据情况和社会文化,知
  • 盲点视网膜的后方称为眼底,在正对视神经起始处,有一呈白色的圆形隆起,称为视神经盘(又称视神经乳头)。此处是神经纤维进出的地方,没有感光细胞,不能感应到光线,故称为盲点。影像能够在盲
  • 多路复用多路复用(Multiplexing,又称“多工”)是一个通信和计算机网络领域的专业术语,在没有歧义的情况下,“多路复用”也可被称为“复用”。多路复用通常表示在一个信道上传输多路信号或
  • 搜狗百科搜狗百科(原“搜搜百科”)为腾讯旗下搜索网站搜搜(SOSO)发布的一个由用户参与编辑的在线百科全书,正式上线于2009年3月30日,2014年3月24日正式更名为搜狗百科。截止2012年7月1日为
  • EF-TsEF-Ts(热稳定延伸因子 英语:elongation factor thermo stable)是原核延伸因子之一EF-Ts 作为EF-Tu(热不稳定延伸因子)的鸟嘌呤核苷酸交换因子(英语:nucleotide exchange factor)行使
  • 拉瓦尔大学拉瓦尔大学(法语:Université Laval) 是位于加拿大魁北克市的一所历史悠久的综合大学,为北美地区建立的第四所高等教育机构,也是该地区最古老的法语大学和加拿大主要大学之一,学
  • 切除修复切除修复(英语:Excision repair)是一类DNA修复机制,通过移除损伤核苷酸并从互补DNA链合成正确的序列的方式来进行修复。几种机制包括:
  • 炎睦高速公路井炎高速公路(井冈山至炎陵高速公路)为湖南炎陵县至江西井冈山市高速公路,湖南段简称“炎睦高速公路”,江西段简称“井睦高速公路”,公路全长约75公里,双向四车道,行车时速80公里,路
  • 宁阳县35°45′31.3″N 116°48′19.6″E / 35.758694°N 116.805444°E / 35.758694; 116.805444坐标:35°45′31.3″N 116°48′19.6″E / 35.758694°N 116.805444°E / 35.7586