依赖倒转原则

依赖倒转原则

依赖倒转原则,意思就是抽象不应该依赖细节,细节应该依赖抽象,说白了,就是要针对接口编程,不要对实现编程。

  • 高层模块不应该依赖底层模块。两个都应该是依赖抽象。
    解释:拿电脑来说,cpu、内存等配件都属于高层模块,而主板就属于底层模块,想想,如果高层模块依赖底层模块,也就是说,cpu、内存等配件坏了的话,就需要连带主板一起换掉,这样代价太大了;所以正常情况下,cpu、内存等高层模块是不会依赖底层模块的(这里的依赖是指必须使用那个品牌那个型号的主板),而是它们双方都依赖于接口,cpu、内存等,不同品牌不同型号之间的内部具体实现可能差异较大,但是他们保证生产出来的都是标准接口,而主板也一样,提供标准的接口插槽,这样一来,他们根本不用管对方的品牌型号,只需在具体实现自己的功能之后提供标准接口就行,如果cup坏了,只需更换cpu而不影响其他配件和主板。
  • 抽象不应该依赖细节。细节应该依赖抽象。
    解释:这里的抽象就是指抽象类或者接口类,而细节就是指具体的代码实现。这里就好理解了,因为正常情况下,抽线类很少改变,而具体的实现可能经常会改变,所以依赖抽象就不怕更改。还有一种原因下面再说。

为什么要叫“倒转”

面向过程开发时,为了使代码可以复用,一般会把常用的代码封装成许多函数的程序库,这样再写新项目时这些底层代码也可以使用,这种情况就是高层模块依赖底层模块,这属于“正”,但是如果有一个新项目,发现业务逻辑的高层模块基本一样,但是要求使用不同的数据库或者存储方式,这样就有问题了,因为高层依赖底层,业务逻辑与底层访问数据库绑定在一起,所以没办法服用这些业务逻辑代码,这就属于“倒转”,正常情况下,因为高层模块经常性的改变,需要复用底层,所以高层依赖底层没问题,但是特殊情况下,底层模块要改变,需要复用高层,这样就需要考虑“倒转”。所以,高层模块不应该依赖于底层模块,它们都应该依赖抽象,具体就是依赖接口或者抽象类。,这样无论时高层代码还是底层代码都很容易复用。

依赖抽象,不怕更改,原因二——里氏代换原则

里氏代换原则:简单来说就是子类必须能够替换掉他们的父类型,再简单来说,就是子类必须包含他的父类型中的所有“东西”。

正因为有了这个原则,所以父类才能真正被复用,子类才能在父类的基础上,增加自己新的行为,正因为这样依赖抽象,才不怕更改,一是因为抽象更改的可能性本来就跟小,如果更改了,因为底层继承于抽象,所以底层无需改变(子类包含父类的所有东西)
依赖倒转原则_第1张图片

你可能感兴趣的:(设计模式)