学习目标:
依赖倒置原则的定义
依赖倒置的代码实现
依赖倒置的优点
定义:
定义:高层模块不应该底层模块,二者都应该依赖其抽象
扩展:1.抽象不应该依赖细节,细节依赖于抽象
2.要针对接口编程,不要针对实现编程
代码示例:
提示:以一个简单的学习为例
例如:tom喜欢学习,并且学习java课程,也学习python课程
public class Tom {
//Tom爱学习,
//学习Java课程
public void studyJvava(){
System.out.println("Tom在学习java课程");
}
//学习Python课程
public void studyPython(){
System.out.println("Tom在学习Python课程");
}
}
public class Test {
public static void main(String[] args) {
//v1
Tom tom=new Tom();
tom.studyJvava();
tom.studyPython();
}
}
在上述例子中我们发现,假设tom现在又想学习大数据的知识,这时候就需要修改代码了,是不是违背了开闭原则
public class Tom {
//Tom爱学习,
//学习Java课程
public void studyJvava(){
System.out.println("Tom在学习java课程");
}
//学习Python课程
public void studyPython(){
System.out.println("Tom在学习Python课程");
}
//学习大数据课程
public void studyBigData(){
System.out.println("Tom在学习大数据课程");
}
}
}
那我们怎么解决问题呢?
可以定义一个课程接口,提供一个学习的方法,让java,python,大数据......实现这个接口,这样在增加新的课程学习的时候就只需要实现课程接口即可:
public interface Icourse {
void study();
}
public class JavaCourse implements Icourse {
@Override
public void study() {
System.out.println("Tom在学习java课程");
}
}
public class PythonCourse implements Icourse {
@Override
public void study() {
System.out.println("Tom在学习Python课程"
);
}
}
这需要对tom的类加以修改
public class Tom {
//Tom爱学习,
public void study(Icourse icourse){
icourse.study();
}
public class Test {
public static void main(String[] args) {
//v2
Tom tom=new Tom();
tom.study(new JavaCourse());
}
}
这里还可以这样修改,将课程作为tom的私有变量,通过构造方法来实现
public class Tom {
//Tom爱学习,
private Icourse icourse;
public void study(){
icourse.study();
}
public Tom(Icourse icourse) {
this.icourse = icourse;
}
public class Test {
public static void main(String[] args) {
//v3
Tom tom=new Tom(new JavaCourse());
tom.study();
}
}
这里还可以通过set方法给私有变量赋值来实现:
public class Tom {
//Tom爱学习,
private Icourse icourse;
public void study(){
icourse.study();
}
public void setIcourse(Icourse icourse) {
this.icourse = icourse;
}
public Tom(Icourse icourse) {
this.icourse = icourse;
}
}
public class Test {
public static void main(String[] args) {
//v4
Tom tom=new Tom();
tom.setIcourse(new JavaCourse());
tom.study();
}
}
优点:
可以减少类与类之间的耦合性,提高程序的扩展性,提高程序的稳定性,提高代码可读性和稳定性,减少了修改程序代码造成的风险