前面有几篇文章,已经教了一些方式或者方法,帮助您摆脱娘胎自带的面向过程编程,从而转为面向对象。
本文讲一下面向对象依赖倒置,使用具体的例子来解释可能好些,网上千篇一律的大多数文字描述,各位估计也不一定真的看明白了。于是,这就是本文的价值所在。
由于我一路走过来,所以,我写的关于面向对象的思想,都是实践性的经验,会站在您还是一个初学者的身份上去讲述它,尽量让读者明白。
本文例子出现的中文是为了便于理解,您实际编写代码时,不宜写中文。
一、什么是依赖倒置
普遍的解释是:程序要依赖于抽象接口,不要依赖于具体实现。
这话我当初看了无数遍,在我初期对面向对象理解还不深的时候,我认识这些字理解这些话,以为自己懂了,实际上,我压根不会用。很长一段时间的实践之后,我才终于明白这话的意思。
二、理解倒置
依赖倒置,倒置的意思就是反过来、翻转过来、倒转过来。本来是先看到头后看到尾的,倒立过来后,就先看到尾再看到头。总之就是反转过来。
三、理解依赖
当初我怎么都想不明白依赖是个啥东西,怎么回事。其实这是因为我当时对依赖不理解的原因,您今天不理解也正是因为这个原因。所以:
您需要了解UML中的关联和依赖。
您需要了解依赖注入中的依赖。
您需要了解属性的定义,这个应该好理解。
您需要了解方法的定义,这个应该好理解。
面向对象中的依赖倒置,既指UML中的关联,也指UML中的依赖,就是UML中的关联和依赖都要适合这个原则。
依赖注入中的依赖,指属性依赖以及方法的参数依赖,这2种都要适合这个原则。
上图红圈的是方法的参数依赖,下图则是属性依赖。
方法参数依赖,是指传进去的方法参数,是一个对象。属性依赖是指返回值是一个对象。
下图则是依赖注入的依赖,通常是构造函数的方法参数进行依赖,当然也有属性依赖注入的,就不举例子了。
四、理解依赖后有什么用?
通过上面的第3点,您已经知道了什么叫依赖,但是你不知道依赖倒置的依赖,要怎么用?
其实就是指:上面第3点中的所有依赖,传递过去的参数(方法),或者返回值(属性),它们必须是抽象的。抽象是指抽象类和接口两种。使用依赖倒置,则建议您更好的方式是使用接口,因为接口是顶级抽象。
所以,您会看到,第3点的截图中,很多的依赖参数是传递的以字母I开头的接口。
五、按照这么做后,生产中实际会有什么效果?
是的,您现在知道了要怎么用。但您不知道为啥要这么用,用了后会怎么样,不用就又会怎么样?
上图是一个形状接口,以及黑板类。在黑板上绘制一个图形,需要使用形状。
现在它的参数依赖是接口,所以,我可以传递正方形这个形状,也可以传递圆锥、圆柱这些形状。这就是依赖倒转的应用。
如果您不使用接口,比如直接参数要求传“正方形”,那么,这个“在黑板上绘制图形”的方法就是个死方法了,限定了只能传正方形对象。
祝您用餐愉快。