定于:
- 高层模块不应该依赖低层模块,二者都应该依赖其抽象
- 抽象不应该依赖细节,细节应该依赖抽象
- 针对接口编程,不要针对实现编程
- 优点:可以减少类间的耦合性,提高系统稳定性,提高代码的可读性和可维护性,可降低修改程序所造成的风险
这里的高层模块就好比是Controller层,低层模块就好比dao层;
核心即面向抽象编程。
实例:
一个学生在学习课程,如果以下面这种方式,显然不合适
public class Student {
public void studyJava(){
System.out.println("学习Java课程");
}
public void studyPython(){
System.out.println("学习Python课程");
}
}
这种面向实现的方法下,扩展性就很差;高层很大程度上就依赖于低层,这里高层就是依赖Student的Test类层,低层就是Student,如果Test中需要Student学习别的课程,就需要在Student类中继续添加方法。
合理的实现方式1
public class Student {
public void studyCourse(ICourse course){
course.study();
}
}
public interface ICourse {
void study();
}
显然上面这种放方法更加合理,扩展性很高,想学什么课,只需要实现ICourse接口,再传给Student类即可。
合理的实现方式2
public class Student {
private ICourse course;
public Student(ICourse course) {
this.course = course;
}
public void setCourse(ICourse course) {
this.course = course;
}
public void studyCourse(){
course.study();
}
}
这种方式的扩展性也很好。即Student想学什么课程,我们可以不修改Student类的代码的前提下,任意修改。