依赖反转原则

✍ dations ◷ 2025-12-01 04:38:33 #软件设计模式,软件设计,编程原则,面向对象的程序设计

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

该原则规定:

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

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

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

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

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

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


相关

  • 芽孢杆菌目脂环酸杆菌科(英语:Alicyclobacillaceae)(Alicyclobacillaceae) 芽孢杆菌科(英语:Bacillaceae)(Bacillaceae) 显核菌科(英语:Caryophanaceae)(Caryophanaceae) 李斯特菌科(英语:Listeriaceae)(L
  • 抑郁性障碍抑郁症,亦称忧郁症,是一类以抑郁心境为主要特点的情感障碍。它主要包括:重度抑郁症、持续性抑郁症、季节性抑郁症。它们的共同表现为:长时间持续的抑郁情绪,并且这种情绪明显超过
  • 独立承揽人一个独立合同人是一个通过一个固定的合同向第三方提供商品或服务的自然人或企业 ,与雇员不同,独立合同人并不有规律地为雇主工作,但会依照代理法在必要的时候为合同方工作。通
  • 北美松鼠灰松鼠(学名:Sciurus carolinensis;英语:eastern gray squirrel、grey squirrel)是一种原生于美国东部及中西部以及加拿大东部省份的树松鼠。它是一种多产且适应性很强的松鼠,后来
  • 越窑越窑是唐朝、五代时浙江绍兴越州的瓷窑,窑址主要分布于慈溪的上林湖一带。隋朝、唐朝时绍兴叫“越州”,因此得名为“越窑”。越窑烧制的青瓷器在唐代很出名。唐代陆羽在《茶经
  • 运输安全管理局美国运输安全管理局(英语:Transportation Security Administration)是美国国土安全部下属的一个机构,负责美国境内公共交通的安全事宜,机构于九一一袭击事件后随国土安全部一同建
  • 永济市永济市是中华人民共和国山西省的一个县级市,由运城市代管。位于山西西南隅,同蒲铁路穿越市境。古称蒲坂,相传为舜帝之都。战国时属于魏国,称蒲邑。秦置蒲坂县,王莽时改蒲城。东汉
  • 百人会百人会(英语:Committee of 100)是美国的一个华裔精英非盈利组织,其成员包括来自商界、政界、学术界及文化界的人。组织于1990年由贝聿铭创立,现任会长是于加利福尼亚大学哈斯汀法
  • 嵊州竹编嵊州竹编为流行于中国浙江省绍兴嵊州市的一种传统手工艺品,原名嵊县竹编,以编织精巧、工艺繁多、花色丰富见长,作为浙江竹编的杰出代表现已被列为中华人民共和国国家级非物质文
  • 高合成数高合成数指一类整数,任何比它小的自然数的因子数目均比这个数的因子数目少。最小的20个高合成数为:高度合成数有无限个。为了证明这点,可用反证法。假设 n