- 定义高层模块不应该依赖底层模块,二者都应该依赖其抽象
- 解释:抽象不应该依赖细节,细节应该依赖抽象
- 针对接口编程,不要针对实现编程
- 优点:减少类间的耦合性,提高系统稳定性,降低修改程序所造成的风险
代码演示:加入有一个dog类,喜欢eat,sleep。如果要该dog还喜欢bark,先看一下错误的示范
Dog类
public class Dog {
public void eat(){
System.out.println("I like eatting");
}
public void sleep(){
System.out.println("I like sleeping");
}
public void bark(){
System.out.println("I like barking");
}
}
Test类
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.eat();
dog.sleep();
//通过频繁的修改了dog的类,输出了bark
dog.bark();
}
}
在这种设计中高层模块test类依赖了低层模块Dog类,不符合依赖倒置原则,改造如下
IHobby接口及两个实现类,EatHobby,SleepHobby
public interface IHobby {
void showHobby();
}
public class EatHobby implements IHobby{
public void showHobby() {
System.out.println("I like eatting");
}
}
public class SleepHobby implements IHobby{
public void showHobby() {
System.out.println("I like sleeping");
}
}
Dog类的改造
public class Dog {
public void showMyHobby(IHobby hobby){
hobby.showHobby();
}
}
Test的调用实现
Dog dog=new Dog();
dog.showMyHobby(new EatHobby());
dog.showMyHobby(new SleepHobby());
重点体会面向接口编程的概念