设计模式--依赖倒转原则

依赖倒转原则又称依赖倒置原则数据库

抽象不该该依赖细节,细节应该依赖于抽象。说白了,就是针对接口编程,不要针对实现编程编程

依赖倒置原则包括三层含义函数

1)高层模块不该该依赖低层模块,二者都应该依赖其抽象;post

2)抽象不该该依赖细节;spa

3)细节应该依赖抽象。对象

看了上面的解释相信你们会和我同样会有一些疑问在脑海里,如下来具体说一说吧:继承

1)为何要针对接口编程,而不是针对实现编程呢?接口

很是easy的一个样例。咱们现在使用的电脑有各式的品牌。联想、神舟、戴尔等等,开发

电脑需要用到鼠标,键盘;若是鼠标、键盘是针对某一个品牌的机器实现去作的话,那么咱们将会遇到什么问题呢?it

那么咱们市面上的键盘和鼠标就都是各式各样的,有一天鼠标。或键盘坏了。咱们要怎么去买呢?难道记住这个电脑是什么品牌。什么型号,还有什么类型的去买么?这样会疯掉的。现在咱们的电脑基本上都是使用USB接口的了,无论是键盘也好,鼠标也好,咱们仅仅要买USB接口的就可以使用了,同一时候,使用USB接口还可以有其它的扩展。仅仅要实现了,这个接口,实现怎么样都不要紧。好比,实现了USB接口的小台灯,仅仅要接上USB线就可以照明了;又如实现了USB

接口的充电器,接到咱们的电脑上就可以充电了。 

2)高层模块不该该依赖低层模块,二者都应该依赖其抽象又怎样理解呢?这个问题也可以这么问:为何要叫倒置(倒转)呢?

在面向过程的开发中,为了使用常常使用的代码可以复用,通常都会把这些常常使用的代码写成许不少多函数的程序库,这样咱们作新项目的时候,就去调用这些函数就可以了。

好比:咱们作的项目大多要訪问数据库。因此咱们就把数据库的代码写成了函数,每次作新项目时就去调用这些函数。这也就是高层依赖于低层模块了。


问题就出现在这里了,咱们在作新项目的时候,会发现业务逻辑的高层模块是同样的,咱们但愿能重用这些高层模块。但是这些高层模块和低层模块的数据库绑定在一块儿了,这样咱们就没办法复用这些高层模块了。

假设咱们的高层模块和低层模块都依赖于抽象,详细一点就是依赖于接口或抽象类。仅仅要接口够稳定。那么不论什么一个的更改都不用操心其它受到影响了。

3)为何依赖了抽象的接口或是抽象类。就不怕更改了呢?要解决问题,先看看里氏替换原则。

里氏替换原则:

一个软件实体假设使用的是一个父类的话,那么必定适用于其子类,而且它察觉不出父类对象和子类对象的差异。

也就是说。在软件里面。把父类都替换成它的子类。程序的行为没有变化;

简单的说:子类型必须能够替换掉它们的父类型。好比:企鹅在生物学分类上是属于鸟的,但是在编程中,企鹅就不能以父类的(鸟)的身份出现。

若是有一个鸟的父类,拥有一个会飞的方法fly(),咱们是不能让企鹅继承于鸟的,这样当子类可以替换掉父类,软件单位的功能不受到影响时,父类才干真正的被复用,

而子类也能够在父类的基础上加入新的行为。

好比:猫是继承动物类的,以动物的身份拥有吃、喝、跑、叫等行为。

可当某一天。咱们需要狗、牛、羊也拥有相似的行为。由于它们都是继承于动物,因此除了更改实例化的地方,程序其它地方就需要改变了。

正是由于子类型的可替换性才使得使用父类类型在的模块在无需改动的状况下就可以扩展。UML图:


高层模块依赖于接口或抽象类。低层模块实现接口或抽象类。依赖倒置原则事实上就是谁也不依靠谁。除了约定的接口,这样你们都可以灵活自由了。

相关文章
相关标签/搜索