`

面向对象设计的原则------依赖倒置原则

阅读更多

依赖倒置原则(Dependence Inversion Principle)

1、依赖倒置原则的定义

     1)上层模块不应该依赖于底层模块,它们都应该依赖于抽象。

     2)抽象不应该依赖于细节,细节应该依赖于抽象,要针对接口编程,不要针对实现编程。

      Abstractions should not depend upon details,Details should depend upon abstractions.Program to an interface, not an implementation.

      也就是说应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。而不要用具体类进行变量的类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。要保证做到这一点,一个具体类应当只实现接口和抽象类中声明过的方法,而不要给出多余的方法。

      基于这个原则,设计类结构的方式应该是从上层模块到底层模块遵循这样的结构:上层类--->抽象层--->底层类。

2、依赖倒置原则与开闭原则的关系

-原则与依赖倒转原则是目标和手段的关系。如果说开闭原则是目标,依赖倒转原则是到达"开闭"原则的手段。如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则,依赖倒转原则是对"抽象化"的最好规范。里氏代换原则是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。

 3、实例

      下面是一个违反了依赖倒转原则的例子。我们有一个上层类Manager和底层类Worker。我们需要在程序中添加一个新模块,因为有新的特殊的工作者被雇用。为此,我们创建一个新的类SuperWorker。

      假设Manager是一个包含非常复杂的逻辑的类,现在为了引入新的SuperWorker,我们需要修改它。让我们看一下这有哪些缺点:

      (1)我们需要修改Manager类(记住,它是一个非常复杂的类,这需要一些时间和努力)。 
      (2)Manager类的一些现有功能可能会受到影响。 
      (3)需要重做单元测试。
       所有的这些问题需要大量的时间去解决。但是如果程序的设计符合依赖倒转原则将会非常简单。意思是我们设计Manager类和一个IWorker接口以及一些实现了该接口的Worker类。当需要添加SuperWorker类时我们只需要让它实现IWorker接口。

//Dependency Inversion Principle - Bad example   
class Worker {   
    public void work() {   
        // ....working   
    }   
}   
  
class Manager {   
    Worker m_worker;   
  
    public void setWorker(Worker w) {   
        m_worker=w;   
    }   
  
    public void manage() {   
        m_worker.work();   
    }   
}   
  
class SuperWorker {   
    public void work() {   
        //.... working much more   
    }   
}  

 

     下面是支持依赖倒转原则的代码。在这个新的设计中,我们增加了一个新的抽象层IWork接口。现在,上面的问题得到了解决:

      不需要修改Manager类。

      使对Manager类现有功能的影响最小化。

      不需要对Manager类重新进行单元测试。

//Dependency Inversion Principle - Good example   
interface IWorker {   
    public void work();   
}   
  
class Worker implements IWorker{   
    public void work() {   
        // ....working   
    }   
}   
  
class SuperWorker  implements IWorker{   
    public void work() {   
        //.... working much more   
    }   
}   
  
class Manager {   
    IWorker m_worker;   
  
    public void setWorker(IWorker w) {   
        m_worker=w;   
    }   
    public void manage() {   
        m_worker.work();   
    }   
}  

 

4、总结

      应用该原则意味着上层类不直接使用底层类,他们使用接口作为抽象层。这种情况下上层类中创建底层类的对象的代码不能直接使用new操作符。可以使用一些创建型设计模式,例如工厂方法,抽象工厂和原型模式。

      模版设计模式是应用依赖倒转原则的一个例子。

      当然,使用该模式需要额外的努力和更复杂的代码,不过可以带来更灵活的设计。不应该随意使用该原则,如果我们有一个类的功能很有可能在将来不会改变,那么我们就不需要使用该原则。

分享到:
评论

相关推荐

    面向对象设计原则-依赖倒置原则示例源码

    依赖倒置原则(Dependence Inversion Principle),缩写为DIP。原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend ...

    OO设计原则 -- OO设计的 DIP依赖倒置原则

    在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出。DIP主要强调的是模块之间的依赖关系应该基于抽象而不是...

    Ruby 面向对象设计实践--2013年

    - **依赖倒置原则**(Dependency Inversion Principle, DIP):高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 ##### 2. 设计模式 设计模式是解决特定问题的通用解决...

    面向对象的设计原则--ooprinciples

    ### 面向对象的设计原则——开放关闭原则详解 #### 一、背景介绍 面向对象编程(Object-Oriented Programming, OOP)是一种广泛应用于现代软件工程的方法论,旨在通过抽象、封装、继承和多态等特性提高软件的可复用...

    软件设计原则-面向对象设计七大原则.zip

    软件设计原则-面向对象设计七大原则.zip 面向对象和C语言完全不是一种思考问题的方式,面向对象是种...只有吃透面向对象的七大设计原则,比如:依赖倒置原则,迪米特法则等,把它们烂熟于心,才能作到看什么书都一样的心境

    依赖倒置原则-软件工程思想

    依赖倒置原则(Dependency Inversion Principle,简称 DIP)是面向对象设计的核心原则之一,由著名软件工程师 Robert C. Martin 在其专栏文章中提出。该原则对于指导软件系统的结构设计、提高代码的可维护性和可扩展...

    面向对象设计原则.ppt

    5. **依赖倒置原则(DIP)**:高层次模块不应该依赖于低层次模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这意味着我们应该设计面向接口而非具体实现,提高代码的灵活性。 6. **迪米特...

    Java_面向对象设计原则总结

    1 依赖倒置原则-Dependency Inversion Principle (DIP) 2 里氏替换原则-Liskov Substitution Principle (LSP) 3 接口分隔原则-Interface Segregation Principle (ISP) 4 单一职责原则-Single ...

    面向对象设计原则(SRP,OCP,LSP,DIP,ISP)

    面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP

    23种 设计模式---面向对象的基本原则

    5. 依赖倒置原则(Dependency Inversion Principle, DIP):高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象。抽象不应该依赖于具体实现,而具体实现应该依赖于抽象。 接下来,我们来看看23种设计模式...

    面向对象设计原则.pdf

    **依赖倒置原则 (DIP, Dependency Inversion Principle)** - **定义**: 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。 - **目的**: 提高模块间的解耦度,使得...

    7依赖倒置原则-课程内容.rar

    依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计的基本原则之一,由软件设计大师Robert C. Martin在其著作《Agile Software Development, Principles, Patterns, and Practices》中提出。这一...

    C++设计模式课件2_面向对象设计原则.pdf

    1. **依赖倒置原则(Dependency Inversion Principle, DIP)** - **原则阐述**:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。 - **实践意义**:通过引入抽象...

    面向对象设计原则解析

    5. **依赖倒置原则(Dependency Inversion Principle, DIP)** 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象。抽象不应该依赖于具体实现,而具体实现应该依赖于抽象。这样可以降低模块间的耦合,...

    面向对象设计原则

    以上介绍的五种面向对象设计原则——单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则和开闭原则,都是面向对象编程领域中非常重要的指导思想。遵循这些原则可以帮助开发者构建出更加健壮、可维护和易于扩展...

    java面向对象设计的六大原则

    以下将详细介绍面向对象设计的六大原则:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则...

    面向对象思想----不看后悔!

    4. **依赖倒置原则**(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,二者都应该依赖于抽象。 5. **接口隔离原则**(Interface Segregation Principle,ISP):客户端不应该被迫依赖它不使用...

    UML简介与面向对象的设计原则

    5. **依赖倒置原则(DIP)**:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。这推动了模块间的解耦。 6. **迪米特法则(Law of Demeter)**:一个对象应该尽可能少地...

    【文档+源码】C++面向对象设计模式-文档与代码.zip

    采用添加一层稳定/间接(微观上比如指针,宏观上比如操作系统、虚拟机、依赖倒置原则)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案 Facade Proxy Adapter Mediator “状态变化”模式 :在组件构建过程...

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则

    5. 依赖倒置原则(DIP):依赖于抽象,而不是依赖于具体实现。这样可以更容易地替换实现,提高代码的可测试性和可维护性。 在C#中,面向对象设计模式可以分为创建型、结构型和行为型三大类。例如: - 创建型模式:...

Global site tag (gtag.js) - Google Analytics