依赖反转原则

维基百科,自由的百科全书
跳转至: 导航搜索

面向对象编程领域中,依赖反转原则(Dependency inversion principle)指代了一种特定的解耦(传统的依赖关系建立在高层次上,而具体的策略设置则应用在低层次的模块上)形式。在这种形势下,为了使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了(例如:反转)。该原则规定:

  1. 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口
  2. 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

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

描述[编辑]

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

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

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

历史[编辑]

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

参见[编辑]

引用[编辑]

  1. ^ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates. Hendrickson, Mike, 编. Head First Design Patterns (paperback). O'REILLY. 2004 [2012-06-21]. ISBN 978-0-596-00712-6 (English).  |editor1-last=|editor-last=只需其一 (帮助); |editor1-first=|editor-first=只需其一 (帮助)
  2. ^ Object Oriented Design Quality Metrics: an analysis of dependencies Robert C. Martin, C++ Report, Sept/Oct 1995
  3. ^ The Dependency Inversion Principle, Robert C. Martin, C++ Report, May 1996

外部链接[编辑]