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