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一 ...
随机推荐
- Mysql安装、设置密码、编码
一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...
- 【JavaScript】轮播图
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...
- Redmine(window7)安装
首先要准备Ruby相关文件,Redmine是基于Ruby on rails开发的. 1.下载railsinstaller,我这时下载的版本是railsinstaller-2.2.1.exe,对应的官网 ...
- spark-jobserver安装实践 (centos7.4)
spark-jobserver 提供了一个RESTful接口来提交和管理spark的jobs,jars和job contexts. 该工程位于:https://github.com/spark-job ...
- 《视觉SLAM十四讲课后作业》第一讲
1. 如何在 Ubuntu 中安装软件(命令⾏界⾯)?它们通常被安装在什么地⽅? 答:一般有两种安装方式(1)apt-get install (2)dpkg -i package.deb.系统软件一般 ...
- Vue 旅游网首页开发3 - Ajax获取首页数据
之前的首页数据都是写死在页面上的,现在修改项目,使得数据通过ajax动态获取. 死胎了 ... 不想写了····
- linux install Openvino
recommend centos7 github Openvino tooltiks 1. download openvino addational installation for ncs2 ncs ...
- Parhaps you are running on a JRE rather than a JDK?
maven项目启动时报错 解决方案: 第一步:在启动项目上右击 第二步:修改JRE为JDK,双击划线部分 第三步:如果没有配置JDK,进行以下操作 第四步:从本地添加JDK 第五步:应用JDK 选择好 ...
- HttpRequest,HttpResponse,乱码,转发和重定向
HttpServletRequest简介 Web服务器收到客户端的http请求,会针对每一次请求,创建一个用于代表请求的HttpServletRequest类型的request对象,并将"H ...
- 王之泰201771010131《面向对象程序设计(java)》第十三周学习总结
第一部分:理论知识学习部分 第11章 事件处理 11.1 事件处理基础 a)事件源(event source):能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事件源是一个 能够注册监听 ...