文档章节

设计原则-依赖倒转原则

hell03W
 hell03W
发布于 2016/11/10 17:16
字数 828
阅读 21
收藏 0

如果说开闭原则是面向对象设计的目标的话, 那么依赖倒转原则就是面向对象设计的主要实现机制之一, 它是系统抽象化的具体实现.

依赖倒转原则: 抽象不应该依赖于细节, 细节应该依赖于抽象. 换言之, 要针对接口编程, 而不是针对实现编程.

依赖倒转原则要求我们在程序代码中传递参数时, 或者在关联关系中, 尽量引用层次高的抽象层类, 即使用接口和抽象类进行变量类型声明, 参数类型声明, 方法返回类型声明, 以及数据类型的转换等, 而不要用具体类做这些事情. 为了确保该原则的应用, 一个具体类应当只是实现接口或抽象类中声明的过的方法, 而不要给出多余的方法, 否则将无法调用在子类中增加的新方法.

在引入抽象层之后, 系统将具有很好的灵活性, 在程序中尽量使用抽象层进行编程, 而将具有具体类写在配置文件中, 这样一来, 如果系统行为发生变化, 只需要对抽象层进行扩展, 并修改配置文件中(针对java), 而无需修改原有系统的源代码, 在不修改的情况下扩展系统的功能, 满足开闭原则的要求.

在实现一来倒转原则时候, 我们需要针对抽象层编程, 而将具体类的对象通过依赖注入的方式注入到其他对象中, 依赖注入指当一个对象要与其它对象发生一来关系时, 通过抽象来注入所一来的对象. 通常的注入方式有三种: 构造注入, 设值注入(setter), 接口注入. 构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

如下图, 某系统经常要存储不同格式的文件到数据库中, 一次要进行数据格式的转换. 如图的方式, 如果增加一种文件格式, 就需要修改CustomerDAO文件, 不符合开闭原则.

针对上图的问题, 可以在CustomDAO与文件转换的类之间引入一个抽象类, CustomerDAO持有抽象类, 具体的文件处理实现抽象类, ..., 如下图所示.

在上述的重构过程中, 用到了开闭原则, 里氏代换原则, 依赖倒转原则, 在大多数情况下, 这三个设计原则会同时出现, 开闭原则是目标, 里氏代换原则是基础, 依赖倒转原则是手段, 他们相辅相成, 相互补充, 目标一致, 只是分析问题时候的角度不同而已.

Reference: http://blog.csdn.net/lovelion/article/details/7562783

本文转载自:http://blog.csdn.net/lovelion/article/details/7562783

hell03W
粉丝 9
博文 145
码字总数 109892
作品 0
朝阳
程序员
私信 提问
设计模式(五)依赖倒转原则(DIP)

1.为何“倒转”? 简单的说,传统的过程性系统的设计办法趋向于使高层次的模块依赖于低层次的模块;抽象层依赖于具体层。倒置原则是要把这个错误的依赖关系倒转过来。抽象层次包含的是应用系...

1527
2018/08/09
0
0
依赖(耦合)倒转原则

依赖也就是耦合,共分为下面3种。 零耦合(Nil Coupling)关系:两个类没有依赖关系。 具体耦合(Concrete Coupling)关系:两个具体的类之间有依赖关系,如果一个具体类直接引用另外一个具体...

长平狐
2013/04/25
64
0
小菜学设计模式——里氏替换原则

背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习《大话设计模式》时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成...

learn_more
2015/05/28
0
0
设计模式之设计原则

image.png “开一闭” 原则(OCP) 经典力学的基石是牛顿三大定律。 而面向对象的可复用设计 (Object Oriented Design, 或 OOD) 的第一块基石,便是所谓的”开-闭“原则 (Open-Closed Princip...

高广超
2018/01/11
0
0
设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)

单一职责原则 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。        如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类...

aehyok
2013/05/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

怎么升级phpstudy中的php版本

http://www.php.cn/jishu/php/413274.html php官网 下载php版本 https://windows.php.net/

15834278076
9分钟前
0
0
文件已删除但句柄没有释放导致磁盘空间用完

有时候会发现linux文件系统分区已经快满了,但又找不到到底是什么文件占用了磁盘空间,就有可能是已删除的文件的句柄没有释放,还占着空间 检查命令: lsof | grep deleted 如果发现很多del...

果树啊
13分钟前
1
0
mysql5.7 [Err] 1118 - Row size too large (> 8126).

mysql [Err] 1118 - Row size too large (> 8126). 问题 mysql5.7 在执行创建表或者增加字段时,发现row size长度过长,导致出现以下错误。 [Err] 1118 - Row size too large (> 8126). C......

GritTan
14分钟前
0
0
[mybatis]一级缓存与二级缓存配置(mybatis3.4.0)

二级缓存 添加<cache />即可 日志: 2019-05-20 16:28:16.525 [http-nio-8830-exec-2] DEBUG com.asiainfo.mysql.MysqlMapper -Cache Hit Ratio [com.asiainfo.mysql.MysqlMapper]: 0.......

Danni3
25分钟前
1
0
Kafka两级调度实现分布式协调任务分配Golang版

背景 基于Kafka消息队列的两级协调调度架构 Kafka内部为了协调内部的consumer和kafka connector的工作实现了一个复制协议, 主要工作分为两个步骤: 通过worker(consumer或connect)获取自身的...

8小时
32分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部