依赖倒置最精简的定义就是“面向接口编程”,这个思想我以前一直没有理解,写了很久的程序了,几乎很少写接口,也从不想去写接口,不知道接口到底有什么用,其实,还是写的少啊,而且写的东西都是小型的东西,看来还没有到达要用接口的程度。但是看了这个原则的讲解,知道了接口,或者叫做抽象的作用的重要性和方便性。
依赖倒置原则在java语言中的表现就是:
1、模块间的依赖是通过抽象发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
2、接口或抽象类不依赖于实现类
3、实现类依赖接口或是抽象类
依赖倒置原则的好处:
1、减少类间的耦合性,这一点是依赖倒置原则最大的好处;
2、降低并行开发引起的风险,这一点我觉得是非常具有意义的一点,将程序的编写由个人作坊式的开发,提升到了团队开发。
以前吧,一直听人讲要面向接口编程,可是我就是体会不到为什么要怎么做,这么做有什么好处,原来这么做的根源就是这个依赖倒置原则所描述的,下面举个例子来简单展示一下面向接口编程的好处:
不使用任何抽象的情况下,司机驾驶奔驰车的类如以下这样来设计:
public class Benz { public void run(){ System.out.println("奔驰车开始启动了..."); } }
public class Driver { public void drive(Benz benz){ benz.run(); } }
public class Client { public static void main(String[] args) { Driver piao=new Driver(); Benz benz=new Benz(); piao.drive(benz); } }这样的设计可以看到有一个缺陷,就是用Driver实例化出来的对象,都只能开一种车,奔驰,如果再有其他的车,这个司机是开不了的,因为它没有对应开其他车的本领,Driver类紧紧的耦合了Benz这个具体类,使Driver类缺少了很多的灵活性,如果这个司机想要开宝马车,那么除了新建一个宝马车类之外,还要再修改Driver这个类,使其具有开宝马车的功能,如果程序很大的话,这无疑增加了项目的风险性,有没有什么好的办法可以避免这样的问题呢?来看一下根据依赖倒置原则,重新设计的类图如下:
可以看到这里就应到到了面向接口编程的方法,在IDriver接口中,依赖的对象是ICar接口,是依赖的车的最高抽象,而不是某一个具体的类了,这样做有什么好处呢?那好处是多多的,首先,我们的Driver类本领就发生了质的变化,从之前的只能开奔驰车,到现在能开任何一个车,是不是很牛?程序代码就不写了,这里只写一个场景类,来看一下具体是怎么用的:
public class Client { public static void main(String[] args) { IDriver suo=new Driver(); ICar benz=new Benz(); suo.drive(benz); } }当这个司机需要换车时,只要实例化出相应车的对象,将它传递给drive()函数的参数,就可以了,其他的地方,都不用修改。我们一直说的程序具有可扩展性,稳定性,健壮性,怎么就具有这些特性了?我现在的理解就是,在修改或是增加程序的功能时,不会引起过其他已经写好的,能正常运行的程序的修改,这是很重要的,没谁想去为了实现一个功能,而去改之前已经写好的功能,如果必须要这么做的话,说明系统设计的不是很好。
小结:
从这个简单的例子中,看到了面向接口编程的好处。结合里氏替换原则,可以得出这样一个规则:接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化。
原文链接:https://www.f2er.com/javaschema/286801.html