其他面向对象设计原则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. [Chrome] chrome 自动跳转到https

    关键字眼: - static_upgrade_mode: FORCE_HTTPS - You cannot visit www.xxx.dev right now because the websit ...

  2. Java stream的常见用法

    不讲原理,只说用法. 1,集合遍历 public class StreamTest { public static void main(String[] args) { //1 遍历 List< ...

  3. Git 命令及git服务器

    Linux 服务器上安装git yum -y install git git config  --global user.name "name" git config  --glo ...

  4. vue知识总结

    vue: 渐进式JavaScript 框架 Vue项目构建 npm install -g vue vue init webpack-simple my-project cd my-project np ...

  5. Recycle----项目总结

    github项目地址:https://github.com/HuChengLing/recycle 软件规模: 我们这个Recycle app属于一个小型项目,整体规模不大.预期有垃圾回收和二手品交易 ...

  6. redis-使用问题

    记录一下相关的问题,使用参考http://www.runoob.com/redis/ 1.DENIED Redis is running in protected mode 这个是启用了保护模式,这个 ...

  7. 用java实现操作两个数据库的数据

    1.首先需要在jdbc的配置文件里面配置两个数据库的连接 数据库1的配置 driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://地址:3306/数 ...

  8. SQL查询数据时报错

    在开发过程中如果查询报如下的错误: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column ...

  9. python coroutine

    1. Python Async/Await入门指南 2. 用 Python 3 的 async / await 做异步编程 3.

  10. 破解360doc个人图书馆网站的右键、复制方法

    chrome浏览器如下做法: 右上角菜单按钮→设置→显示高级设置→隐私设置下的 内容设置按钮→javascript下的管理例外情况→添加 [*.]360doc.com 设置为禁止 →完成