是指设计代码结构时,高层模块不应该依 赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象。
很多刚开始学不知道高层模块和底层模块。 先看demo
public class Parkin {
public void studyJavaCourse() {
System.out.println("parkin正在学习JAVA");
}
}
// 测试类
public class MainTest {
public static void main(String[] args) {
Parkin parkin = new Parkin();
parkin.studyJavaCourse();
}
}
这时候要想继续学习Python课程,难道我们又在Parkin类里加一个studyPython的方法吗,然后测试类再来调用,如果是这样,就违背了开闭原则。
这里的高层模块就是测试类,底层模块就是Parkin类,所以如果这样写,高层模块依赖与底层模块又违背了依赖倒置原则。
改进:
// 课程抽象
public interface ICourse {
void study();
}
public class JavaCourse implements ICourse {
@Override
public void study() {
System.out.println("学习JAVA");
}
}
public class Parkin {
public void studyCourse(ICourse course) {
course.study();
}
}
// 测试类
public class MainTest {
public static void main(String[] args) {
Parkin parkin = new Parkin();
parkin.studyCourse(new JavaCourse());
}
}
这时候如果想学习Python课程,只需增加类,不用修改代码了。
public class PythonCourse implements ICourse {
@Override
public void study() {
System.out.println("学习Python");
}
}
// 测试类
public class MainTest {
public static void main(String[] args) {
Parkin parkin = new Parkin();
parkin.studyCourse(new JavaCourse());
parkin.studyCourse(new PythonCourse());
}
}
优点:
提高系统稳定性,提高代码可读性和可维护性,并能够降低修改程序所 造成的风险。
缺点:
可能导致类的膨胀
注意:所以一个系统应该先考虑整体再到细节,不要去考虑实现,面向抽象编程。