其他面向对象设计原则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. sql 查询所有作业的详情

    DECLARE @WeekDays TABLE ( freq_interval INT, weekdays ) ) INSERT INTO @WeekDays ,N'星期日 ' UNION ALL , ...

  2. CentOS 7 安装samba服务

    STEP 1. 安装 #安装 [root@study ~]yum install smaba [root@study ~]systemctl start smb nmb STEP 2. 建立共享目录以 ...

  3. 2017.11.19 C语言基础及流水灯实现

    /* 从右往左*/ #include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADD ...

  4. 《Whitelabel Error Page 404》 对于Springboot初学者可能出现问题的原因

    whitelabel error page异常一定是有原因的,比如,访问路径不对,解析不对,注解忘记引入等.对于初学者,一定要注意一点,程序只加载Application.java所在包及其子包下的内容 ...

  5. Linq、Lambda表达式详细总结(转)

    (一)输入参数 在Lambda表达式中,输入参数是Lambda运算符的 左边部分.它包含参数的数量可以为0.1或者多个.只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略.输入参数的数 ...

  6. 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结

    湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...

  7. Powershell获取硬件信息

    1.获取系统的BIOS的信息: Get-WMIObject -Class Win32_BIOS 2.获取内存信息: Get-WMIObject -Class Win32_PhysicalMemory ...

  8. Windows 下安装 Memcached

    Windows 下安装 Memcached 官网上并未提供 Memcached 的 Windows 平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可 ...

  9. 大佬是怎么思考设计MySQL优化方案的?

    在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 一.优化的哲学 注:优化有风险,涉足需谨 ...

  10. 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)

    任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...