依赖倒置原则
363字约1分钟
2022-03-25
定义
依赖倒置原则(Dependency Inversion).
- 高层模块不应该依赖低层模块, 两者都应该依赖其抽象.
- 抽象不应该依赖细节, 细节应该依赖抽象.
实现方法
在高层模块和底层模块之间引入一个抽象的接口层. 抽象接口是对低层模块的抽象, 低层模块继承或实现该抽象接口. 这样高层模块不直接依赖底层模块而是依赖于接口层.
- 依赖于抽象.
- 设计接口而非设计实现. 使用继承避免对类的直接绑定.
- 避免传递依赖. 使用继承和抽象类来消除依赖.
示例
反例
考虑一个熔炉调节器, 从一个 I/O 通道读取当前的温度, 并通过向另一个 I/O 通道发送指令来控制熔炉继续加热或停止.
Regulate.h
const byte THERMONETER=0x86;
const byte FURNACE=0x87;
const byte ENGAGE=1;
const byte DISENGAGE=0;
void Regulate(double minTemp,double maxTemp)
{
for(;;)
{
while (in(THERMONETER) > minTemp)
wait(1);
out(FURNACE,ENGAGE);
while (in(THERMONETER) < maxTemp)
wait(1);
out(FURNACE,DISENGAGE);
}
}
很明显, 代码中包含很多实现的底层细节, 这段代码并不能很好地被重用.
正例
Regulate.h
void Regulate(Thermometer t, Heater h, double minTemp,
double maxTemp)
{
for(;;)
{
while (t.Read() > minTemp)
wait(1);
h.Engate();
while (t.Read() < maxTemp)
wait(1);
h.Disengage();
}
}