1、什么是依赖倒置原则
模块间的依赖关系通过抽象实现,实现类之间不发生直接的依赖关系,其依赖关系通过接口或抽象类完成;
接口和抽象类不应该依赖于实现类;
实现类应该依赖于接口和抽象类;
2、如果不考虑依赖倒置原则会出现什么问题呢
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);}}
如果现在自己想换辆宝马开开该怎么办,只能新增一个宝马类,然后在Driver类中新增一个方法,这样的改动就太大了,需求是想换辆车,但是司机也得该,修改的地方太多,出错的风险也就大了
//将司机模块抽象为一个接口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);}}
3、DIP的三种写法
接口声明依赖对象:在接口的方法中声明依赖对象,就如同上边的例子;
构造函数传递依赖对象:
//将司机模块抽象为一个接口public interface IDriver {public void drive();}public class Driver implements IDriver{private ICar car;//注入public void Driver(ICar car){this.car = car;}public void drive(ICar car){this.car.run();}}
set方法传递依赖对象:
public interface IDriver{//注入依赖public void setCar(ICar car);public void drive();}public class Driver implements IDriver{private ICar car;public void setCar(ICar car){this.car = car;}public void drive(){this.car.run();}}
4、总结
依赖倒置原则的核心就是面向抽象(接口和抽象类)编程;
