设计原则之依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

问题:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,     负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

举个栗子:讲一个读者读书的故事。。。

1. 新建一个类Book,包含获取书的内容的方法,代码如下:

2. 新建一个类Reader,依赖类Book,包含一个读书的read方法,代码如下:

3. 在类DIPFragment中,通过类Reader的对象调用read方法来实现读者读书的功能,代码如下:

4. 运行后的效果是:

以上,就实现了一个读者读书的故事。现在要改需求,我们不读书了,改读报纸了,那么我们要新建一个报纸类Newspaper,同样包含一个获取报纸的内容的方法,然后去修改读者类Reader,替换掉类Book,又去修改实现类DIPFragment,这样是不是觉得改动的地方太多了,跟重新写无异,试想一下,如果原有的功能比较复杂的话,那样再进行需求变动,要做的工作是很多的,原因就是Reader与Book的耦合性太高,所以必须降低他俩之间的耦合度才行,于是我们可以引入抽象的接口IRead,包含一个获取读物内容的getReadContent方法,具体实现如下:

1. 新增一个抽象的接口IRead,包含一个获取读物内容的getReadContent方法,代码如下:

2. 新增一个报纸类Newspaper,实现接口IRead;同样让类Book也去实现接口IRead。代码如下:

3. 让高层模块去依赖接口,即类Reader依赖接口IRead,它负责完成主要的具体的业务逻辑。代码如下:

4. 在类DIPFragment中,通过类Reader的对象调用read方法来实现读者读书的功能,代码如下:

5. 运行后的效果是:

   以上就是采用的依赖倒置原则,降低了Reader和Book、Newspaper之间的耦合性,无论以后怎样扩展DIPFragment类,都不需要再修改Reader类了,给多人并行开发带来了极大的便利,Reader和Book、Newspaper可以同时开工,互不影响,这样也就提高了系统的稳定性,降低了修改程序造成的风险。
原则:面向接口编程。抽象指的是接口或抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,     而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

注意:     1. 在代码中传递参数或关联关系时,尽量引用高层的抽象层类,即使用接口和抽象类进行变量声明、参数类型声明、        方法返回类型声明以及数据类型的转换;     2. 当一个对象和其他对象有依赖关系时,可以利用依赖注入的方法将类之间进行解耦,主要有:构造注入、Set方法注入        和接口注入;     3. 开闭是原则,里氏是基础,依赖倒置是手段;     4. 低层模块尽量都要有抽象类或接口,或者两者都有;     5. 变量的声明类型尽量是抽象类或接口;     6. 使用继承时遵循里氏替换原则。

好处:     1. 可降低类之间的耦合性;     2. 可提高系统的稳定性;     3. 可降低修改程序所造成的风险。
时间: 2024-12-22 01:23:23

设计原则之依赖倒置原则的相关文章

6大设计原则之依赖倒置原则

依赖倒置原则: 包含三层含义: 高层模块不应该依赖低层模块,二者应该依赖抽象 抽象不应该依赖细节 细节应该依赖抽象 再精简些就是:其核心是面向接口编程 抽象:即抽象类和接口,抽象是对实现的约束,对依赖而言也是一种契约 细节:即具体的实现类,实现接口或继承抽象类所产生的类 依赖倒置就是通过抽象使各个类或模块间实现彼此独立,互不影响,实现模块间的松耦合. 依赖的三种实现方式: 构造函数注入 Setter依赖注入 接口注入 6大设计原则之依赖倒置原则

面向对象原则之一 依赖倒置原则

原文:面向对象原则之一 依赖倒置原则 前言 面向对象有人分为五大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则. 也有人分为六大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则.迪米特法则. 现在我们来介绍依赖倒置原则 依赖倒置原则 1)概念 a.高层模块不应该依赖于底层模块,两者应该依赖于其抽象. b.抽象不应该依赖具体实现,具体实现应该依赖抽象. 上面2点是依赖倒置原则的概念,也是核心.主要是说模块之间不要依赖具体实现,依赖接

设计模式六大原则之依赖倒置原则

一.概念: 依赖倒置原则英文缩写DIP(Dependence Inversion Principle)原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. 翻译过来就三层含义

深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/22/solid-javascript-the-dependency-inversion-principle/ 依赖倒置原则 依赖倒置原则的描述是: A. High-level modules should not

设计模式六大原则(三)——依赖倒置原则

依赖倒置原则 定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类B改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修改类A,会给程序带来不必要的风险. 解决方案: 将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率. 依赖倒置原则基于这样一个事实:

Java的开发—面向对象的7大原则之依赖倒置原则(一)

一.定义: 依赖倒置原则(Dependecy Inversion Principle) 原文为: High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions 三层定义: 1.高层模块不应该依赖底层模

[敏捷设计]5.DIP依赖倒置原则

一.定义 1.高层模块不应该依赖低层模块,二者都应该依赖抽象 2.抽象不应该依赖于细节.细节应该依赖于抽象 二.层次化 1.简单介绍 结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良好的.受控的接口向外提供了一组内聚的服务. 对于这个陈述的简单理解可能会致使设计者设计出类似下图的结构. 图中,高层的Policy层使用了低层的Mechanism层,而Mechanism层又使用了更细节的Utility层.这样,Policy层对下面的Utility层的改动都是敏感的. 这种依赖关系是

面向对象设计原则四:依赖倒置原则

依赖倒置原则(DIP)        定义:高层模块不应该依赖底层模块,两者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 好处:稳定性.可维护性.可扩展性. 概述:DI就是依赖倒置的意思,也可称为控制反转,我们以前编写结构化的程序当中,也就是C语言这样的语言时,高层模块依赖于底层模块,也就是调用者和被调用者的关系,调用者要依赖于被调用者,被调用者编写的一些功能和服务,会影响高层,一旦底层发生了变化,也就是被调用者发生了变化,就直接影响了高层也就是调用者.这样的设计,很难保证他的稳定性

设计模式 之 设计的 六大原则(3) 依赖倒置原则

依赖倒置原则 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修改类A,会给程序带来不必要的风险. 解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率. 依赖倒置原则基于这样一个事实:相对于