7.12 其他面向对象设计原则3: 依赖倒置原则DIP
其他面向对象设计原则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的更多相关文章
- 设计模式学习--面向对象的5条设计原则之依赖倒置原则--DIP
一.DIP简介(DIP--Dependency Inversion Principle): 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象.2.抽象不应该依赖于细节,细节应该依赖于抽象. ...
- IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)
定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层模块(原 ...
- 最简单直接地理解Java软件设计原则之依赖倒置原则
理论性知识 定义 依赖倒置原则,Dependence Inversion Principle (DIP) 高层模块不应该依赖低层模块.二者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象. 针 ...
- 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:htt ...
- Java设计模式(2:单一职责原则和依赖倒置原则详解)
一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...
- 设计模式——如何避免在OO设计中违反依赖倒置原则
1 变量不可以包含具体类的引用.一旦new,就对具体类产生依赖,用工厂模式来避开. 2 类不要派生至具体类.用派生抽象类避开. 3 不要覆盖基类已经实现的方法.基类中已实现的方法应该由所有子类共享.
- 【面向对象设计原则】之依赖倒置原则(DIP)
依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...
- C#软件设计——小话设计模式原则之:依赖倒置原则DIP
前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...
- Java设计原则之依赖倒转原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一 ...
随机推荐
- [Chrome] chrome 自动跳转到https
关键字眼: - static_upgrade_mode: FORCE_HTTPS - You cannot visit www.xxx.dev right now because the websit ...
- Java stream的常见用法
不讲原理,只说用法. 1,集合遍历 public class StreamTest { public static void main(String[] args) { //1 遍历 List< ...
- Git 命令及git服务器
Linux 服务器上安装git yum -y install git git config --global user.name "name" git config --glo ...
- vue知识总结
vue: 渐进式JavaScript 框架 Vue项目构建 npm install -g vue vue init webpack-simple my-project cd my-project np ...
- Recycle----项目总结
github项目地址:https://github.com/HuChengLing/recycle 软件规模: 我们这个Recycle app属于一个小型项目,整体规模不大.预期有垃圾回收和二手品交易 ...
- redis-使用问题
记录一下相关的问题,使用参考http://www.runoob.com/redis/ 1.DENIED Redis is running in protected mode 这个是启用了保护模式,这个 ...
- 用java实现操作两个数据库的数据
1.首先需要在jdbc的配置文件里面配置两个数据库的连接 数据库1的配置 driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://地址:3306/数 ...
- SQL查询数据时报错
在开发过程中如果查询报如下的错误: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column ...
- python coroutine
1. Python Async/Await入门指南 2. 用 Python 3 的 async / await 做异步编程 3.
- 破解360doc个人图书馆网站的右键、复制方法
chrome浏览器如下做法: 右上角菜单按钮→设置→显示高级设置→隐私设置下的 内容设置按钮→javascript下的管理例外情况→添加 [*.]360doc.com 设置为禁止 →完成