设计模式——依赖倒转原则之我见

依赖倒置原则
疑惑

Java开发中,我们都用过spring ,我们都知道spring有两大特性,IoC(inversion of controller )和AoP(aspect oriented programming)。其中的控制反转又叫做依赖注入dependency injection依赖倒置。spring中的依赖倒置是指spring容器帮助一个类查找和注入对象,你所操作的类只是被动的接受其依赖的对象,而不用在这个类中去创建你依赖对象,你要做的只是定义一个变量来接受注入的那个对象。从我们理解spring中可以看出,spring的设计师,在设计spring时,使用了依赖倒置这个思想。那么依赖倒置的具体内容又是什么呢。。。

定义

Dependence Inversion Principle(DIP):
High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.

高层次模块不应该依赖于低层次模块。并且二者都应该依赖于抽象。
抽象不应该依赖于抽象,抽象也不依赖于实现,但是实现应该依赖于抽象。

  • 低层次模块:不可分割的原子逻辑,可能会根据业务逻辑经常变化
  • 高层次模块:低层次模块的再组合,对低层次模块的抽象 。
  • 抽象:接口或者抽象类。是底层模块的抽象,不能直接实例化。
  • 与接口或抽象对应的实现类:低层次模块的具体实现,可以被直接实例化。

根据前人的理解,和我自己的理解,解释下这一点:面向过程开发时,为了使得常用的代码可以复用,一般都会将一些常用的代码携程许多函数的程序库,这样再写新的项目时,就可以直接调用这些低层次的函数了。比如访问数据库这件事儿,我们把创建连接指定数据库连接的connection的步骤放入一个函数中(低层次模块,感觉类似于服务端),每次做新的功能时比如保存用户信息(高层次模块,相当于客户端),需要进行数据库连接的话,直接调用函数(低层次模块)就可以了,这样就叫做高层次模块依赖低层次模块。但是,如果当我们需要将用户信息保存到其他数据库时,就是需要连接不同的数据库时,之前写的那个函数就不能用了,毕竟之前写的那个函数只能连接指定的数据库,而且之前写的那个保存用户的方法也不能用了,应为旧的saveUserMethod与连接指定数据库的函数是绑在一起的。对比与计算机的组成,cpu、内存、硬盘都依赖于主板,但是如果主板坏掉后,cpu、硬盘、内存条有可能并没有坏掉,拆下来或许可以继续使用。也就是说,主板(高层模块)和内存条(低层次模块)之间互相关联的只是那个插内存条的针脚口,他们都依赖于那个插槽(相当于接口),而且主板和内存条都是可以复用的,也就是说高层次和低层次都依赖于接口(抽象),而且都可以复用。

指的是程序设计要依赖于抽象,不要依赖于具体。具体来讲可以认为是面向接口编程。依赖倒转原则可以说是上篇提到的开闭原则的实现途径。只有面向接口编程,才能更好的实现对修改关闭,对扩展开放。

面向接口编程指的是使用Java接口或者Java抽象类进行变量的类型声明、参数类型声明、方法返回类型声明(就是定义方法签名)以及数据类型的转换等算法。通过在接口中定义这些结构化的算法,然后在具体的子类中分别实现这些算法,达到高内聚低耦合的目的。

使用

在具体实现依赖倒转模式时,我们可以向使用底层地的逻辑方法中传递一个抽象对象,来作为参数,当具体调用时,可以传入具体的实现,(里氏替换原则),这样就可以实现了。

后记——-
人勤事事易,人懒事事难。

猜你喜欢

转载自blog.csdn.net/Jatham/article/details/81839592