举个栗子,咱们的电脑蓝屏了,通常是内存条坏了,这时候咱们只须要更换内存条就能够保证电脑从新正常运行。数据库
可是若是是收音机坏了,咱们每每有种无从下手的感受,为何复杂的电脑容易修而简单的收音机却这么难修呢?编程
依赖倒转原则函数
A.高层模块不该该依赖底层模块。两个都应该依赖抽象。spa
B.抽象不该该依赖细节。细节应该依赖抽象。设计
为何要叫倒转呢?对象
面向过程开发时,为了使代码复用,通常都会把这些代码写成许多函数的程序库,作项目时只须要调用这些低层的函数库就能够了。继承
好比咱们作的项目大多要访问数据库,因此咱们把数据库的代码写成函数,每次调用就能够了,这就叫作高层模块依赖低层模块。接口
但客户但愿使用不一样的数据库或存储方式,麻烦就出现了,由于高层模块都是和底层的访问数据库绑定在一块儿的,没办法复用这些高层模块。内存
就像电脑若是CPU、内存、硬盘都须要依赖主板,主板一坏,全部部件就都没用了。反过来,内存坏了也不该该形成其余部件不能使用才对。开发
若是无论高层模块仍是低层模块,都依赖于抽象,具体点就是接口或抽象类,只要接口是稳定的,那么任何一个更改都不用担忧其余受到影响,这就使得高低模块均可以复用。
为何依赖了抽象的接口或抽象类,就不怕更改呢?
里氏代换原则
子类型必须可以替换掉他们的父类型。
面相对象设计时,一个是鸟类,一个是企鹅类,若是鸟是能够飞的,企鹅不会飞,那么企鹅是鸟吗?企鹅能够继承鸟这个类吗?
按咱们现实的角度,企鹅是一种特殊的鸟,尽快不能飞,但他也是鸟,固然能够继承
可是在面向对象设计时,子类拥有父类全部非private的行为和属性。鸟会飞,而企鹅不会飞。
尽快在生物学的分类上企鹅是一种鸟,但在编程世界里,企鹅不能以父类——鸟的身份出现。由于前提说全部鸟都能飞,而企鹅飞不了,因此企鹅不能继承鸟类。
也正由于有了这个原则,使得继承复用成为了可能
只有当子类能够替换掉父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也可以在父类的基础上增长新的行为。
也正由于有了里氏替换原则,才是的开放-封闭成为了可能,正是因为子类的可替换性才使得使用父类类型的模块在无需修改的状况下就能够扩展。
依赖倒转起始就是谁也不须要依赖谁,除了约定的接口,你们均可以灵活自如。
收音机就是典型的耦合过分,只要收音机出现故障,无论是没有声音、不能调频仍是有杂音,反正都很难修理,由于各个部件相互依赖,难以维护。
依赖倒转能够说是面向对象设计的标志,用哪一种语言不重要,若是编写时考虑的都是如何针对抽象编程而不是针对细节编程,
即程序中全部的依赖关系都是终止于抽象类或接口,那就是面向对象的设计,反之那就是过程化的设计了。