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一 ...
随机推荐
- 消息中间件之一:RabbitMQ
RabbitMQ 是一个实现了AMQP(高级消息队列协议)的消息队列,最初起源于金融系统,主要用来实现应用程序间的异步和解耦,可用于在分布式系统中做消息的存储转发 相比于传统的队列服务概念(消息发送者 ...
- MyBatis探究-----传递参数详解
1.单个参数 mybatis不会做特殊处理,#{参数名/任意名}:取出参数值 例如:接口中方法 public Employee getEmpById(String empId); XML中 <s ...
- SQL kaggle learn with as excercise
rides_per_year_query = """ SELECT EXTRACT(YEAR FROM trip_start_timestamp) AS year ,CO ...
- Http请求头和常见响应状态码
请求头: Accept:指浏览器或其他客户可以接爱的MIME文件格式.可以根据它判断并返回适当的文件格式. Accept-Charset:指出浏览器可以接受的字符编码.英文浏览器的默认值是ISO-88 ...
- php 使用代理IP进行数据抓取
什么是代理?什么情况下会用到代理IP?代理服务器(Proxy Server),其功能就是代用户去取得网络信息,然后返回给用户.形象的说:它是网络信息的中转站.通过代理IP访问目标站,可以隐藏用户的真实 ...
- Linux 管理环境变量的文件分为系统级和用户级别
Linux 管理环境变量的文件分为系统级和用户级别 管理环境变量的文件也分为系统级和用户级别: 1.系统级:/etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于 ...
- jvm启动参数设置 -Dfile.encoding=UTF-8 解决freemark乱码
今天一个spring boot应用windows跑起来后页面显示乱码,加上jvm启动参数为utf-8后,页面显示正常.
- 剑指offer(65)矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- Session &cookie introduction,usage
Cookie 1)什么是Cookie? 服务器为了识别用户身份而临时存放在浏览器端的少量数据. 2)工作原理 浏览器访问服务器时,服务器将一些数据以set-cooki ...
- ZJOI 2017 树状数组(线段树套线段树)
题意 http://uoj.ac/problem/291 思路 不难发现,九条カレン醬所写的树状数组,在查询区间 \([1,r]\) 的时候,其实在查询后缀 \([r,n]\) :在查询 \([l,r ...