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一 ...
随机推荐
- 将 notepad++ 添加到鼠标右键菜单 带图标
1.打开注册表编辑器,HKEY_CLASSES_ROOT\*\shell目录点击右键.新建-->项,这里命名的项则就是鼠标右键列表里面显示的内容,这里起名为[Edit With Notepad+ ...
- php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别以及REQUEST_URI的讲解
今天再次遇到了这个问题通过$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']获取域名及请求的URL的问题,便再次百度了,发现没学习一次都有新的知识,便分享出 ...
- P3974 [TJOI2015]组合数学
题目描述 为了提高智商,ZJY开始学习组合数学.某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才可能把财宝全捡完. 但是她还不知足,想到 ...
- java数组集合元素的查找
java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...
- GoldenGate for bigdata 12.3.2.1版本新特性
在Oracle Tenical Network(OTN)上已经可以下载到最新的ogg4bd版本,地址如下:http://www.oracle.com/technetwork/middleware/go ...
- java集合的三种遍历方式
import java.util.ArrayList; import java.util.Collection;import java.util.Iterator;public class Home ...
- context使用
1. 概述 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开协程的生命周期,在go语言中,只能通过channel + select来实现,但不够直观,很绕. ...
- Mac appStore下载软件报500错误的解决方法
Step1.打开"启动台": Step2:打开"其他": Step3:打开"终端": Step4:复制如下代码,主要不要作任何更改,不要有多 ...
- Spring cloud Greenwich Eureka
1.父工程POM文件中: <dependencyManagement> <dependencies> <!--spring cloud--> <depende ...
- javascript的对象内容对比
vue是这样对比的 function looseEqual (a, b) { if (a === b) return true const isObjectA = isObject(a) const ...