大话设计模式--第五章 依赖倒置原则
依赖倒置原则
所谓的依赖倒置原则
A.针对接口编程, 不要针对实现编程
B.高层模块不应该依赖于底层模块, 两个都应该依赖于抽象
|
依赖倒置原则: 原话解释的是, 抽象不应该依赖于细节, 细节应该依赖于抽象. 说白了, 就是上面那句话。针对接口编程, 不要针对实现编程。
以计算机为例。无论是主板, 还是cpu,内存,硬盘都要针对接口来设计,如果针对实现来设计,内存就要对应到具体的某个主板, 那么, 就会出现内存坏了需要把主板也换了的尴尬。
以前, 我们在开发的时候, 习惯于将某个业务封装成一个方法. 这样达到复用的效果。比如: 我们做项目的时候,大多要访问数据, 所以我们就把访问数据的代码写成一个函数, 每次做新项目是就去调用这些函数。这也就是高层模块依赖底层模块。
问题也就出现在这里。我们要做新项目了, 发现业务逻辑的高层某块是一样的, 但是客户却希望使用不用的数据库或存储信息的方式。这时就麻烦了。 我们希望能够再次利用这些高层模块. 但是高层模块都是与底层的数据库绑定在一起的。没办法复用这些高层模块,这就非常的糟糕。
就像刚才说的,PC里如果cpu,内存,硬盘都需要依赖具体的主板, 主板一块,素有的部件就都没用了,这显然不合理。 反过来, 如果内存坏了,也不应该造成其他部件不能用才对。
如果不管高层模块还是底层模块,他们都依赖于抽象, 具体一点就是接口或者抽象类,只要接口是稳定的,那么任何一个的更改都不用担心其他受到影响。这就是无论高层模块还是低层模块都可以很容易地被复用。这才是最好的办法。
为什么依赖于接口或者抽象类,就不怕更改呢? 这里就要说另一个原则: 里氏替换原则。
里氏替换原则: 子类必须能够替换掉他们的父类.
|
这里要明确一个问题,如果在面向对象设计时, 一个是鸟类, 一个是企鹅类, 如果鸟是可以飞的, 企鹅不会飞,那么企鹅是鸟类么?企鹅可以继承鸟这个类么? 逻辑上来说, 企鹅是鸟类,可以继承鸟类。 可是, 从面向对象的设计来考虑,子类要拥有父类所有的非private的属性和行为。鸟会飞, 企鹅不会飞。尽管生物学分类上, 企鹅是鸟类,但在编程的世界里,企鹅不能以父类-鸟的身份出现,因为前提说所有的鸟都会飞,而企鹅不能飞,所以,企鹅不能继承鸟类。
只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正的被复用, 而子类也能够在父类的基础上增加新的行为。例如: 猫是继承于动物类的, 以动物的身份拥有吃, 喝, 跑, 叫等行为, 可当有一天, 我们需要狗, 牛, 羊也拥有类似的行为, 由于 他们都是继承于动物, 所以除了更改实例化的地方,程序其他处不需要更改。
里氏替换原则, 才使得开放-封闭成为可能。也正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。不然, 还谈什么扩展开放,修改关闭呢。
依赖倒置原则,高层模块不应该依赖低层模块, 两个都应该依赖抽象。
![](https://img2020.cnblogs.com/blog/1187916/202106/1187916-20210627082053046-596566365.jpg)