依赖倒置原则
Dependency Inversion Principle 简称DIP。
什么是依赖倒置原则
1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
2.抽象不应该依赖于细节,细节应该依赖于抽象。
每个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块。
抽象指抽象类,细节指实现类。
依赖倒置原则的优点
- 减少类间的耦合性
- 提高系统的稳定性
- 降低并行开发引起的风险
- 提高代码的可读性和可维护性
如何做到依赖倒置原则
- 每个类尽量都有接口和抽象类,或两者都有。
- 变量的表面类型尽量是接口或者抽象类。
- 任何类都不应该从具体类派生。
- 尽量不要覆写基类的方法。
- 结合里氏替换原则使用。
代码举例
在JavaScript里,依赖倒置原则的适用性仅仅限于高层模块和低层模块之间的语义耦合,比如,DIP可以根据需要去增加接口而不是耦合低层模块定义的隐式接口。
- 改造前,司机开奔驰车,高层模块司机依赖低层模块奔驰车。这时添加宝马车会发现司机没有开宝马车的方法,也就是添加了低层模块需要去改高层模块。
class Benze {
constructor() {}
run() {
console.log("benze");
}
}
class Driver {
constructor() {}
drive() {
const car = new Benze();
car.run();
}
}
const driver = new Driver();
driver.drive();
- 改造后,通过依赖注入我们可以在不动高层模块的前提下,任意的修改低层模块。
class Benze {
constructor() {}
run() {
console.log("benze");
}
}
class BMW {
constructor() {}
run() {
console.log("bmw");
}
}
class Driver {
constructor(car) {
this.car;
}
set(car) {
this.car = car;
}
drive() {
this.car.run();
}
}
const driver = new Driver();
driver.set(new BMW());
driver.drive();