依赖倒置原则 (Dependence Inversion Principle, DIP): 高层模块不应该依赖底层模块,二者都应该依赖其抽象.抽象不应该依赖细节, 细节应该依赖抽象.
- 减少类与类之间的耦合,提高系统稳定性,可读性,可维护性
- 降低修改程序造成的风险
new 一个小明
public class XiaoMing {
public void studyScienceCourse(){
System.out.println("小明在学习理科课程");
}
public void studyArtsCourse(){
System.out.println("小明在学习文科课程");
}
}
调用一下
public static void main(String[] args) {
XiaoMing xiaoMing = new XiaoMing();
xiaoMing.studyScienceCourse();
xiaoMing.studyArtsCourse();
}
如果需要再添加一门体育课程,在此架构上新增体育课程,要从低层到高层依次修改代码,在Xiaoming类中增加studySportsCourse();.高层也需要追加调用,系统发布后,会非常不稳定,修改代码的同时也会带来其他风险.如果优化代码?
先来个课程接口
public interface ICourse {
void study();
}
理科实现类
public class ScienceCourse implements ICourse{
@Override
public void study() {
System.out.println("小明在学习理科课程");
}
}
文科实现类
public class ArtCourse implements ICourse {
@Override
public void study() {
System.out.println("小明在学习文科课程");
}
}
修改小明类的实现
public class XiaoMing {
public void study(ICourse course){
course.study();
}
}
调用代码
public static void main(String[] args) {
XiaoMing xiaoMing = new XiaoMing();
xiaoMing.study(new ScienceCourse());
xiaoMing.study(new ArtCourse());
}
这种架构,如果小明还想学其他的课程,那么我们只需要再新增一个类,然后通过传参的方式,不需要更改底层代码
面向接口编程, 先顶层再细节的设计代码,以抽象为基准比以细节为基准搭建的架构要稳定的多