那些你要知道的设计原则之-依赖倒置

那些你要知道的设计原则之-依赖倒置_第1张图片

1.定义

1.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
2.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

2.作用

  • 降低耦合度
  • 使高层次模块更容易复用

3.案例

以读书为例子,下面有两个书类分别是英语书和数学书,并拥有相同的book方法。

public class EnglishBook {

    public void book() {
        System.out.print("英语书");
    }

}
public class MathBook {

    public void book() {
        System.out.print("英语书");
    }
}

书有了开始读书创建Reading类,提供read()方法根据书本的类型去读书

//读书类
public class Reading {

    int bookType; //书本类型

    EnglishBook englishBook = new EnglishBook();

    MathBook mathBook = new MathBook();

    //构造函数传入书本类型
    public Reading(int bookType) {
       this.bookType = bookType;
    }
    //根据书本类型开始读书
    public void read(){

        if(bookType == 0){
            //类型为0的时候读英语书
            englishBook.book();
        }else{
            //否则读数学书
            mathBook.book();
        }

    }

}

上面的例子中很明显的违背了依赖倒置原则,高层次的模块(Reading)依赖于低层次模块的具体实现(EnglishBook 和EnglishBook ),如果程序没有变动还好(好毛),一旦业务增加,出现了其他种类的书,我想以现在的耦合性来说只有if else 了吧。


根据依赖倒置原则,增加一个IBook接口提供book抽象方法

public interface IBook {
    
   void book();
}

实现细节实现IBook接口,这就是具体实现应该依赖于抽象。

public class EnglishBook  implements IBook{

    @Override
    public void book() {
        System.out.print("英语书");
    }
}

public class MathBook implements IBook{

    @Override
    public void book() {
        System.out.print("英语书");
    }
}

这个时候高层次的Reading 类也不在需要依赖于低层次模块了,直接依赖于抽象,实现依赖倒置

//读书类
public class Reading {

    IBook iBook;

    public Reading(IBook iBook) {
       this.iBook = iBook;
    }

    public void read(){

        iBook.book();
    }

}

4.总结

依赖倒置原则提倡面向接口编程,可以减少类间的耦合度,提高代码的可读性。使用依赖倒置原则之后将不会再出现向最开始的那种情况,一旦业务逻辑增加就需要去修改高层次的模块这是非常不合理的,而且非常不利于高层次的复用。

你可能感兴趣的:(那些你要知道的设计原则之-依赖倒置)