`

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

阅读更多

依赖倒置原则(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 ...

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

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

    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

    面向对象的11个原则

    依赖倒置原则(The Dependency Inversion Principle?) 接口分离原则(The Interface Segregation Principle) 包的的设计原则 发布/重用等价原则(REP) 公共闭合原则(CCP) 共同重用原则(CRP) 非循环依赖原则(ADP) ...

    SunshlnW#Design-Mode#面向对象设计原则1

    面向对象设计原则常见原则依赖倒置原则(DIP)高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。封装变化点使用封装来创建对象之间的分界

    PHP面向对象五大原则之依赖倒置原则(DIP)详解

    主要介绍了PHP面向对象五大原则之依赖倒置原则(DIP),简单讲述了依赖倒置原则的概念、原理并结合实例形式分析了php依赖倒置原则相关定义与使用方法,需要的朋友可以参考下

    面向对象设计原则(整理)

    单一职责原则(SRP)、开放-封闭原则(OCP)、Liskov替换原则(LSP)、依赖倒置原则(DIP)、接口分离原则(ISP)

    面向对象设计三要素五原则六视点

    面向对象三要素 封装(Encapsulation) 继承(Inheritance) 多态(Polymorphism) 面向对象六视点 ... 依赖倒置原则(DIP) 接口隔离原则(ISP) 变化(Change) 简约(Simplicity) 一致(Coherance)

    面向对象六大设计原则

    3、依赖倒置原则(Dependence Inversion Principle,DIP) 4、接口隔离原则(Interface Separate Principle,ISP) 5、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP) 6、迪米特法则(Law of ...

    mySpringIoc

    幸亏Robert Martin大师提出了面向对象设计原则----依赖倒置原则: A. 上层模块不应该依赖于下层模块,它们共同依赖于一个抽象。 B. 抽象不能依赖于具象,具象依赖于抽象。 理解:A.上层是使用者,下层是被使用者...

    OOD设计基本原则 面向对象设计必备

    OCP原则 里氏替换原则 依赖倒置原则 接口隔离原则 聚合与继承原则 单一职责原则 Separation of concerns Principle Pareto Principle (帕雷多原则 80/20原则)

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    3.依赖倒置原则:面向接口编程 4.接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 5.迪米特法则还有一个更简单的定义:只与直接的朋友通信。其中,我们称出现成员...

    设计原则.ppt

    面向对象的设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置原则 接口分离原则 迪米特法则 合成复用原则

    OOP(面向对象编程)四个基本原则

    面向对象编程的四个基本原则 1、开放封闭原则 2、依赖倒置原则 3、接口分离原则 4、Liskov替换原则

    JAVA面向对象详细资料

    35面向对象设计原则 54 1、找出应用中可能需求变化的代码,把它们独立出来,不要和那些需求不变化的的代码混在一起 54 2、针对接口编程,而不要针对实现类编程 54 3、多用组合,少用继承(包含实现) 54 4、为了交互...

    面向对象七大设计原则,详细解释版

    详细解释了开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则以及合成服用原则,是不可多得的学习资料。

    kunlingou#lifealien#Java-一览设计模式1

    软件设计模式概述GoF 的 23 种设计模式的分类和功能UML中的类图及类图之间的关系开闭原则——面向对象设计原则里氏替换原则——面向对象设计原则依赖倒置原则—

    敏捷软件开发:原则、模式与实践.pdf

    第11章 依赖倒置原则(DIP) 第12章 接口隔离原则(ISP) 第三部分 薪水支付案例研究 第13章 COMMAND模式和ACTIVE OBJECT模式 第14章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第15章 FACADE模式和MEDIATOR...

Global site tag (gtag.js) - Google Analytics