依赖倒置原则
定义
高层模块不应该依赖底层模块,二者应该依赖其抽象对象
抽象不应该依赖细节;细节应该依赖抽象
针对接口编程,不要针对实现编程
优点
可以减少类间的耦合性、提高系统稳定行,提高代码可读性和可维护性,
可降低修改程序造成的风险
代码演示
public class Tom {
public void studyJavaCourse(){
System.out.println("Tom 正在学习Java课程");
}
public void studyPython(){
System.out.println("Tom 正在学习Python课程");
}
}
public class DipTest {
public static void main(String[] args) {
Tom tom = new Tom();
tom.studyJavaCourse();
tom.studyPython();
}
}
如果tom学习新的课程(面向实现编程),代码:
public class Tom {
public void studyJavaCourse(){
System.out.println("Tom 正在学习Java课程");
}
public void studyPython(){
System.out.println("Tom 正在学习Python课程");
}
public void studyAI(){
System.out.println("Tom 正在学习AI课程");
}
}
public class DipTest {
public static void main(String[] args) {
Tom tom = new Tom();
tom.studyJavaCourse();
tom.studyPython();
tom.studyAI();
}
}
这样在扩展的时候违反了开闭原则,而且会带来意想不到的威胁。
优化后的代码遵守了开闭原则:底层不变,只修改应用层
基于注入的方式
public interface ICourse {
void study();
}
public class Tom {
public void study(ICourse iCourse){
iCourse.study();
}
}
public class JavaCourse implements ICourse{
@Override
public void study() {
System.out.println("Tom 正在学习Java课程");
}
}
public class DipTest {
public static void main(String[] args) {
Tom tom = new Tom();
tom.study(new JavaCourse());
}
}
基于构造方法
public interface ICourse {
void study();
}
public class Tom {
private ICourse iCourse;
public Tom(ICourse iCourse) {
this.iCourse = iCourse;
}
public void study() {
iCourse.study();
}
}
public class JavaCourse implements ICourse{
@Override
public void study() {
System.out.println("Tom 正在学习Java课程");
}
}
public class DipTest {
public static void main(String[] args) {
Tom tom = new Tom(new JavaCourse());
tom.study();
}
}
基于set方法
public interface ICourse {
void study();
}
public class Tom {
private ICourse iCourse;
public void setICourse(ICourse iCourse){
this.iCourse = iCourse;
}
public void study() {
iCourse.study();
}
}
public class JavaCourse implements ICourse{
@Override
public void study() {
System.out.println("Tom 正在学习Java课程");
}
}
public class DipTest {
public static void main(String[] args) {
Tom tom = new Tom();
tom.setICourse(new JavaCourse());
tom.study();
}
}
总结
项目中的编程应该是面向接口或面向抽象的,不能面向实现
在扩充代码时,应该只修改应用层,而不动底层的类或接口(开闭原则)