其他面向对象设计原则3: 依赖倒置原则DIP
   The Dependency Inversion Principle
7.1 依赖倒置原则DIP

  The Dependency Inversion Principle

    I. 高层模块不应当依赖低层模块 ,两者都依赖抽象

      High-level modules should not depend on low-level modules,Both should depend on abstractions

    II.抽象不能依赖细节,细节应当依赖抽象

      Abstractions should not depend on details, Details should depend on abstractions R. Martin, 1996

   引导

     继承层次关系中,基类不应当知道任何子类

      A base class in an inheritance hierarchy should not know any of its subclasses

     不能依赖一个有详细实现的模块,而这个模块本身也应当依赖抽象

      Modules with detailed implementations are not depended upon, but depend themselves upon abstractions

     OCP宣扬了目标,DIP宣扬了机制

      OCP states the goal; DIP states the mechanism
7.2 为什么依赖倒置原则DIP ?

   传统的面向过程的程序设计,以功能划分系统

     高层模块是业务/应用规则 High level modules: business/application rules

     低层模块是对这些规则的实现 Low level modules: implementation of the business rules

     高层模块完全依赖调用低层模块提供的功能来完成自己的功能

      High level modules complete their functionality by calling/invoking the low level implementation provided by the low level modules

   因此,高层依赖底层 High level depends on the lower level
7.2 为什么依赖倒置原则DIP ?
  比较:过程化程序与 面向对象架构
    过程化程序架构
    面向对象系统架构 Object-Oriented Architecture
7.3 依赖倒置原则的启发1
   使用继承,避免类之间的直接绑定 Use inheritance to avoid direct bindings to classes:
    面向接口设计,而不是面向实现设计 Design to an interface, not an implementation!
   为什么面向接口设计 Design to an Interface

     因为

       抽象类/接口修改的概率偏低 tend to change much less frequently

       抽象概念容纳的范围广,易于扩展/修改 abstractions are ‘hinge points’ where it is easier to extend/modify

       不应当修改代表抽象的类/接口,符合OCP原则 shouldn’t have to modify classes/interfaces that represent the abstraction (OCP)

       举例:中央的政策不能轻易修改,而乡镇的政策,错了马上改

     例外情况 Exceptions

       有些类非常成熟、稳定 Some classes are very unlikely to change

         插入抽象层,好处不多了,例如 String class,这里就可以直接使用具体类

         此时,不考虑依赖倒置的问题了
    避免传递性依赖 Avoid Transitive Dependencies
     使用继承机制,消除传递性依赖
     如果对自己设计的类找不到一个满意的解决方案,尝试把职责委 派其他一个或者多个类

      If you cannot find a satisfactory solution for the class you are designing, try delegating responsibility to one or more classes

    每当有疑虑时,增加一个间接层 When in doubt, add a level of indirection

7.12 其他面向对象设计原则3: 依赖倒置原则DIP的更多相关文章

  1. 设计模式学习--面向对象的5条设计原则之依赖倒置原则--DIP

    一.DIP简介(DIP--Dependency Inversion Principle): 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象.2.抽象不应该依赖于细节,细节应该依赖于抽象.   ...

  2. IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)

    定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层模块(原 ...

  3. 最简单直接地理解Java软件设计原则之依赖倒置原则

    理论性知识 定义 依赖倒置原则,Dependence Inversion Principle (DIP) 高层模块不应该依赖低层模块.二者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象. 针 ...

  4. 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:htt ...

  5. Java设计模式(2:单一职责原则和依赖倒置原则详解)

    一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...

  6. 设计模式——如何避免在OO设计中违反依赖倒置原则

    1 变量不可以包含具体类的引用.一旦new,就对具体类产生依赖,用工厂模式来避开. 2 类不要派生至具体类.用派生抽象类避开. 3 不要覆盖基类已经实现的方法.基类中已实现的方法应该由所有子类共享.

  7. 【面向对象设计原则】之依赖倒置原则(DIP)

    依赖倒转原则(Dependency Inversion  Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...

  8. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...

  9. Java设计原则之依赖倒转原则

    定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一 ...

随机推荐

  1. 将 notepad++ 添加到鼠标右键菜单 带图标

    1.打开注册表编辑器,HKEY_CLASSES_ROOT\*\shell目录点击右键.新建-->项,这里命名的项则就是鼠标右键列表里面显示的内容,这里起名为[Edit With Notepad+ ...

  2. php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别以及REQUEST_URI的讲解

    今天再次遇到了这个问题通过$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']获取域名及请求的URL的问题,便再次百度了,发现没学习一次都有新的知识,便分享出 ...

  3. P3974 [TJOI2015]组合数学

    题目描述 为了提高智商,ZJY开始学习组合数学.某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才可能把财宝全捡完. 但是她还不知足,想到 ...

  4. java数组集合元素的查找

    java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...

  5. GoldenGate for bigdata 12.3.2.1版本新特性

    在Oracle Tenical Network(OTN)上已经可以下载到最新的ogg4bd版本,地址如下:http://www.oracle.com/technetwork/middleware/go ...

  6. java集合的三种遍历方式

    import java.util.ArrayList;  import java.util.Collection;import java.util.Iterator;public class Home ...

  7. context使用

    1. 概述 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开协程的生命周期,在go语言中,只能通过channel + select来实现,但不够直观,很绕. ...

  8. Mac appStore下载软件报500错误的解决方法

    Step1.打开"启动台": Step2:打开"其他": Step3:打开"终端": Step4:复制如下代码,主要不要作任何更改,不要有多 ...

  9. Spring cloud Greenwich Eureka

    1.父工程POM文件中: <dependencyManagement> <dependencies> <!--spring cloud--> <depende ...

  10. javascript的对象内容对比

    vue是这样对比的 function looseEqual (a, b) { if (a === b) return true const isObjectA = isObject(a) const ...