1.定义
高层模块不应该依赖低层模块,二者都应该依赖其抽象。
通俗易懂的说,就是应该依赖接口,而不是实现,也就是我们常说的面向接口编程。这样类和类之间就不会直接依赖,从而能够实现开闭原则。类依赖接口,当需要扩展的时候我们可以替换实现。
依赖倒置原则可以减少类之间的耦合性、提高代码可读性。
2.代码示例
某个人学习课程。
class Steven {
public void studyJava() {
System.out.println("Steven学习Java课程");
}
public void studyPython() {
System.out.println("Steven学习Python课程");
}
}
public class Test {
public static void main(String[] args) {
Steven steven = new Steven();
steven.studyJava();
steven.studyPython();
}
}
Steven学习Java课程
Steven学习Python课程
上层应用对底层实现类依赖太大,上层需要扩展新功能,必需要在底层实现类修改代码。
3.改进
public interface ICourse {
void studyCourse();
}
public class JavaCourse implements ICourse{
@Override
public void studyCourse() {
System.out.println("Steven学习Java课程");
}
}
public class PythonCourse implements ICourse {
@Override
public void studyCourse() {
System.out.println("Steven学习Python课程");
}
}
class Steven {
public void study(ICourse iCourse) {
iCourse.studyCourse();
}
}
public class Test {
public static void main(String[] args) {
Steven steven = new Steven();
steven.study(new JavaCourse());
steven.study(new PythonCourse());
}
}
4.构造器注入
class Steven {
private ICourse iCourse;
Steven(ICourse iCourse) {
this.iCourse = iCourse;
}
public void study() {
this.iCourse.studyCourse();
}
}
public class Test {
public static void main(String[] args) {
// Steven steven = new Steven(new JavaCourse());
// steven.study();
Steven steven = new Steven(new PythonCourse());
steven.study();
}
}
Steven学习Python课程
Spring的Bean是单例的。
5.属性注入
class Steven {
private ICourse iCourse;
public void setICourse(ICourse iCourse) {
this.iCourse = iCourse;
}
public void study() {
this.iCourse.studyCourse();
}
}
public class Test {
public static void main(String[] args) {
Steven steven = new Steven();
steven.setICourse(new JavaCourse());
steven.study();
steven.setICourse(new PythonCourse());
steven.study();
}
}
Steven学习Java课程
Steven学习Python课程