依赖倒置原则

1.依赖倒置原则的概念

依赖倒置原则是六大原则之一,依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

依赖倒置原则的具体含义:

1、高层模块不应该依赖底层模块,二者都应该依赖抽象。

2、抽象不应该依赖细节,细节应该依赖抽象。

3、依赖倒置的中心思想是面向接口编程。

4、依赖倒置原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定的多。

5、使用接口或抽象类的目的是指定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类来完成。

2.依赖倒置原则的目的

首先在面向对象的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。
其次在面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。
面向过程思想的结构图如下:
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3.依赖倒置原则的经典案例
案例设计图:
该案例中,司机类和奔驰类都是细节,并且没有实现或继承抽象。由设计图可以看出,司机有一个drive()方法,是用来开车,奔驰车有一个run()方法,用来表示车辆运行,并且奔驰车类依赖于司机类,用户模块表示高层模块,负责调用司机类和奔驰车类。
代码如下:

public class Driver {
//司机的主要职责就是驾驶汽车
public void drive(Benz benz){
benz.run();
}
}

public class Benz {
//汽车肯定会跑
public void run(){
System.out.println("奔驰汽车开始运行...");
}
}

//高层模块
public class Client {
public static void main(String[] args) {
Driver xiaoLi = new Driver();
Benz benz = new Benz();
//小李开奔驰车
xiaoLi.drive(benz);
}
}

当小李想换宝马车开时虽然可以新建一个宝马类,加上run()方法,但是车已经有了,但是小李不能开,因为司机类里并没有宝马车的依赖。

那是因为上面的设计没有使用依赖倒置原则。

当使用依赖倒置原则时设计图如下:

代码如下:

//将司机模块抽象为一个接口
public interface IDriver {
//是司机就应该会驾驶汽车
public void drive(ICar car);
}

public class Driver implements IDriver{
//司机的主要职责就是驾驶汽车
public void drive(ICar car){
car.run();
}
}

//将汽车模块抽象为一个接口:可以是奔驰汽车,也可以是宝马汽车
public interface ICar {
//是汽车就应该能跑
public void run();
}

public class Benz implements ICar{
//汽车肯定会跑
public void run(){
System.out.println("奔驰汽车开始运行...");
}
}

public class BMW implements ICar{
//宝马车当然也可以开动了
public void run(){
System.out.println("宝马汽车开始运行...");
}
}

//高层模块
public class Client {
public static void main(String[] args) {
IDriver xiaoLi = new Driver();
ICar benz = new Benz();
//小李开奔驰车
xiaoLi.drive(benz);
}
}

 

posted @ 2020-03-20 10:59  jyqdaisy  阅读(579)  评论(0编辑  收藏  举报