这个是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
设计代码结构的时候, 高层模块不应该依赖底层模块,二者应该依赖它的抽象, 抽象不应该依赖细节, 细节依赖抽象.
通过依赖倒置,减少类与类之间的耦合, 提高系统的稳定性, 可维护性. 降低修改程序造成的风险.
例子
还是以课程为例
public class Tom {
public void studyJavaCourse() {
System.out.println("tom在学习java课程");
}
public void studyPythonCourse() {
System.out.println("tom在学习python课程");
}
}
来调用一下
public static void main(String[] args) {
Tom tom = new Tom();
tom.studyJavaCourse();
tom.studyPythonCourse();
}
tom热爱学习, 后续还会学习AI, 大数据.
这时候, 需要从低层到高层依次修改, 在tom中增加studyAI(),高层也要追加调用, 这样一来我们的系统非常不稳定
我们创建个接口
public interface ICourse {
void study();
}
java课程接口
public class JavaCourse implements ICourse {
@Override
public void study() {
System.out.println("正在学习java课程");
}
}
python课程接口
public class PythonCourse implements ICourse {
@Override
public void study() {
System.out.println("正在学习python课程");
}
}
我们来调用下
public class Tom {
public void study(ICourse course) {
course.study();
}
public static void main(String[] args) {
Tom tom = new Tom();
tom.study(new JavaCourse());
tom.study(new PythonCourse());
}
}
tom的兴趣无论再怎么多, 只要添加类, 通过传参数的方式告诉调用那边就行
传参数还有构造器注入, setter方法