1、什么是依赖倒置原则
    模块间的依赖关系通过抽象实现,实现类之间不发生直接的依赖关系,其依赖关系通过接口或抽象类完成;
    接口和抽象类不应该依赖于实现类;
    实现类应该依赖于接口和抽象类;

    2、如果不考虑依赖倒置原则会出现什么问题呢

    1. public class Driver {
    2. //司机的主要职责就是驾驶汽车
    3. public void drive(Benz benz){
    4. benz.run();
    5. }
    6. }
    7. public class Benz {
    8. //汽车肯定会跑
    9. public void run(){
    10. System.out.println("奔驰汽车开始运行...");
    11. }
    12. }
    13. //高层模块
    14. public class Client {
    15. public static void main(String[] args) {
    16. Driver xiaoLi = new Driver();
    17. Benz benz = new Benz();
    18. //小李开奔驰车
    19. xiaoLi.drive(benz);
    20. }
    21. }

    如果现在自己想换辆宝马开开该怎么办,只能新增一个宝马类,然后在Driver类中新增一个方法,这样的改动就太大了,需求是想换辆车,但是司机也得该,修改的地方太多,出错的风险也就大了

    1. //将司机模块抽象为一个接口
    2. public interface IDriver {
    3. //是司机就应该会驾驶汽车
    4. public void drive(ICar car);
    5. }
    6. public class Driver implements IDriver{
    7. //司机的主要职责就是驾驶汽车
    8. public void drive(ICar car){
    9. car.run();
    10. }
    11. }
    12. //将汽车模块抽象为一个接口:可以是奔驰汽车,也可以是宝马汽车
    13. public interface ICar {
    14. //是汽车就应该能跑
    15. public void run();
    16. }
    17. public class Benz implements ICar{
    18. //汽车肯定会跑
    19. public void run(){
    20. System.out.println("奔驰汽车开始运行...");
    21. }
    22. }
    23. public class BMW implements ICar{
    24. //宝马车当然也可以开动了
    25. public void run(){
    26. System.out.println("宝马汽车开始运行...");
    27. }
    28. }
    29. //高层模块
    30. public class Client {
    31. public static void main(String[] args) {
    32. IDriver xiaoLi = new Driver();
    33. ICar benz = new Benz();
    34. //小李开奔驰车
    35. xiaoLi.drive(benz);
    36. }
    37. }

    3、DIP的三种写法
    接口声明依赖对象:在接口的方法中声明依赖对象,就如同上边的例子;
    构造函数传递依赖对象:

    1. //将司机模块抽象为一个接口
    2. public interface IDriver {
    3. public void drive();
    4. }
    5. public class Driver implements IDriver{
    6. private ICar car;
    7. //注入
    8. public void Driver(ICar car){
    9. this.car = car;
    10. }
    11. public void drive(ICar car){
    12. this.car.run();
    13. }
    14. }

    set方法传递依赖对象:

    1. public interface IDriver{
    2. //注入依赖
    3. public void setCar(ICar car);
    4. public void drive();
    5. }
    6. public class Driver implements IDriver{
    7. private ICar car;
    8. public void setCar(ICar car){
    9. this.car = car;
    10. }
    11. public void drive(){
    12. this.car.run();
    13. }
    14. }

    4、总结
    依赖倒置原则的核心就是面向抽象(接口和抽象类)编程;