依赖倒转原则(Dependence Inversion Principle)注意事项
- 高层模块不应该依赖(使用)底层模块,二者都应该依赖其抽象
- 底层模块尽量要有抽象类或者接口,程序稳定性更好
- 变量的声明类型尽量是抽象类或者接口,变量引用于实际对象之间会存在一个缓冲层,利于程序的扩展优化(eg:在替换变量的实现类时,只需要修改当前变更位置,而不用修改其余调用位置)
- 细节(实现类)应该依赖抽象(接口、抽象类),抽象不应该依赖细节
- 依赖倒转的中心思想是面向接口编程
- 相对于细节的多变性,抽象的东西要更稳定。以抽象为基础搭建的框架比以细节为基础的架构要稳定的多。
- 抽象指的是接口或者抽象类,细节就是具体的实现类
- 使用接口或抽象类的目的是制定好规范,不涉及的任何具体的操作,展现细节的工作要由实现类去完成
采用依赖实现方式实现功能
class Dollar{
public int getCount(){
return 10;
}
public double getExchangeRate(){
return 6.5;
}
}
class Blank{
public void convert(Dollar dollar){
double rmb = dollar.getCount() * dollar.getExchangeRate();
}
}
采用依赖倒转原则来实现代码
class Dollar implements IConvert {
public int getCount() {
return 10;
}
public double getExchangeRate() {
return 6.5;
}
@Override
public double convert() {
return this.getExchangeRate() * this.getCount();
}
}
interface IConvert {
public double convert();
}
class Blank {
public void convert(IConvert c) {
c.convert();
}
}
依赖关系传递的三种方式
interface IOpen {
public void open(IMainframe mainframe);
}
interface IMainframe {
public void play();
}
class Equipment implements IOpen {
@Override
public void open(IMainframe mainframe) {
mainframe.play();
}
}
interface IOpen {
public void open();
}
interface IMainframe {
public void play();
}
class Equipment implements IOpen {
private IMainframe mainframe;
public Equipment(IMainframe mainframe) {
this.mainframe = mainframe;
}
@Override
public void open() {
mainframe.play();
}
}
interface IOpen {
public void open();
public void set(IMainframe mainframe);
}
interface IMainframe {
public void play();
}
class Equipment implements IOpen {
private IMainframe mainframe;
@Override
public void set(IMainframe mainframe) {
this.mainframe = mainframe;
}
@Override
public void open() {
mainframe.play();
}
}