依赖倒置原则
- 定义:高层模块不应该依赖低层模块,他们都应该依赖其抽象,
- 抽象不应依赖细节,而细节应该依赖抽象,
- 针对抽象编程,而不应该对实现编程。
## 优点:
- 减少类与类之间的耦合性;
- 提高系统的稳定性;
- 增加可读性和可维护性;
- 降低修改程序所造成的风险。
Coding 来一个例子吧!!!!
版本1
1. 创建一个ICourse类
package com.maomao.design.principle.dependenceinversion;
public interface ICourse {
void studyCourse();
}
2.创建一个Maomao类(底层模块)
package com.maomao.design.principle.dependenceinversion;
public class Maomao {
public void studyJavaClass(){
System.out.println("我在学习Java课程");
}
public void studyPythonClass(){
System.out.println("我在学习Python课程");
}
}
3. 写一个测试类(高层模块)
package com.maomao.design.principle.dependenceinversion;
public static void main(String[] args) {
Maomao maomao = new Maomao();
//maomao学习Java课程
maomao.studyJavaClass();
// maomao学习Python课程
maomao.studyPythonClass();
}
}
这样写如果Maomao要学习其它的课程,再增加其它学习课程的方法就是针对实现编程,这样扩展性不好,而且要经常修改代码。那么就要修改Maomao这个类的代码,这违反了开闭原则,所以,要不断演进代码
版本2
1. 创建一个抽象类ICourse
package com.maomao.design.principle.dependenceinversion;
public interface ICourse {
void studyCourse();
}
2.分别创建JavaCourse,PythonCourse,PECourse 实现(implements) ICourse
package com.maomao.design.principle.dependenceinversion;
public class JavaCourse implements ICourse {
@Override
public void studyCourse() {
System.out.println("我在学习Java课程");
}
}
package com.maomao.design.principle.dependenceinversion;
public class PythonClass implements ICourse{
@Override
public void studyCourse() {
System.out.println("我在学习Python课程");
}
}
package com.maomao.design.principle.dependenceinversion;
public class FECourse implements ICourse {
@Override
public void studyCourse() {
System.out.println("我的学习前端课程");
}
}
那么Maomao这个类可以这样写
package com.maomao.design.principle.dependenceinversion;
public class Maomao {
public void studyCourse(ICourse iCourse){
iCourse.studyCourse();
}
}
Test类 :
package com.maomao.design.principle.dependenceinversion;
public class Test {
public static void main(String[] args) {
Maomao maomao = new Maomao();
maomao.studyCourse(new JavaCourse());
maomao.studyCourse(new PythonClass());
}
}
结果:
我在学习Java课程
我在学习Python课程
版本3
主要是通过Maomao类的构造器的方法将ICourse传入构造器中
package com.maomao.design.principle.dependenceinversion;
public class Maomao {
private ICourse iCourse;
Maomao(ICourse iCourse){
this.iCourse = iCourse;
}
public void studyCourse(){
iCourse.studyCourse();
}
}
Test类内容及结果
package com.maomao.design.principle.dependenceinversion;
public class Test {
public static void main(String[] args) {
Maomao maomao = new Maomao(new JavaCourse());
maomao.studyCourse();
Maomao maomao1 = new Maomao(new PythonClass());
maomao1.studyCourse();
}
}
这个版本也不是最好的,我们一般都希望Maomao是个单例,以保证案例,所以,第四版本,将Maomao这个类暴露它的set方法
版本4
package com.geely.design.principle.dependenceinversion;
public class Geely {
public void setiCourse(ICourse iCourse) {
this.iCourse = iCourse;
}
private ICourse iCourse;
public void studyImoocCourse(){
iCourse.studyCourse();
}
}