依赖倒置原则包含三层含义:
- 高层的模块不依赖低层模块,两部分模块应该依赖抽象
- 抽象不依赖细节
- 细节应该依赖抽象
所谓抽象指的是接口或者抽象类;
细节指的是实现类,实现接口或者继承抽象类儿产生的类;特点是可以直接被实例化就是可以new一个对象
依赖倒置原则在Java中的表现:
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,依赖老是通过接口或抽象类产生的
- 接口或抽象类不依赖于实现类
- 实现类依赖接口或抽象类
精炼的解释就是“面向接口编程”----面向对象的精髓之一
依赖倒置原则原则可以减少类间的耦合性,提高系统的稳定性,提高可读性和可维护行
证明定理正确的方法有论题和反论题两种方式
通过下面例子说明反论题不成立
现在的汽车越来越便宜了,一个卫生间的
造价就可以买到一辆不错的汽车,有汽车就必然有人来驾驶
//定义一个司机
public class Driver{
//定义司机开车的方法
public void drive(HongQi hongqi){
hongqi.run();
}
}
//定义红旗类
public class HongQi{
//汽车的移动方法
public void run(){
System.out.println("红旗开车");
}
}
//车和司机都备齐了进行场景测试
public class Client{
public static void main(String[] args){
Driver dri = new Driver();
HongQi hongqi = new HongQi();
dri.drive(hongqi);
}
}
在放生变更的时候才能发觉设计或程序是否耦合,下面多加一辆车
//添加一两宝马车进行测试
public class BMW{
//宝马车也是可以开动的
public void run(){
System.out.println("宝马车准备开动")
}
}
司机可以开红旗车却开不了宝马不符合现实的情况,具有易变性而不是稳定性
为了结局这个问题感觉应该要建立两个接口司机和汽车两部分各管各的
司机指定调用dive()方法这是必须的,因为司机是驾驶车的
//司机接口
public interface IDriver{
public void drive(ICar car);
}
定义出来接口那么需要司机接口的实现类
public class Driver implements IDriver{
//司机的职责开车
public void drive(ICar car){
car.run();
}
}
将之前的两辆车作为ICar接口的实现类定义
public interface ICar{
//凡是汽车都可以跑
public void run();
}
public class HongQi implemets ICar{
public void run(){
System.out.println("红旗发动机启动");
}
}
public class BMW implemets ICar{
public void run(){
System.out.println("宝马动了");
}
}
//下面进行业务现场的测试
public class Client{
public static void main(String[] args){
IDriver Tom = new IDriver();
ICar hongqi = new HongQi();
//Tom开红旗
Tom.drive(hongqi);
}
}
主函数中想要驾驶哪辆直接实例化,在drive方法中传入相应对象即可
抽象是对实现的约束,对依赖着来说是一种契约,同时约束自己以及外部的关系保证所有细节不脱离契约范畴
今儿先学到这了,下期学习依赖的三种写法以及综合