Article
依赖倒置原则:张无忌靠的是内力,不是招式
· 7 分钟阅读
张无忌修炼九阳神功后,他不再依赖于具体的武功招式去克敌制胜,而是依赖于自身强大的内力根基。九阳神功赋予了张无忌深厚的内力,让他在面对各种敌人和复杂情况时,不是直接依赖某种特定的招数,而是通过调动内力,结合对战斗形势的理解,灵活运用各种武功的原理来应对。张无忌深厚内力即为高层模块,所学的乾坤大挪移、太极等武功是底层模块,而他对武学本质的理解即为抽象,能够指导张无忌在不同情况下选择合适的武功来运用内力。

高层和低层都依赖抽象
依赖倒置原则强调:
- 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
- 抽象不应该依赖于细节,细节应该依赖于抽象。
示例:数据存储
通过将数据存储逻辑定义在抽象接口中,使得高层模块可以依赖于抽象数据存储接口,而不依赖于具体的存储实现类。这样,在需要添加新的存储方式时,只需实现新的存储类,而无须修改高层模块的代码。
接口和实现类
// 接口:数据存储
interface DataStore {
save(data: string): void;
}
// 实现类:数据库存储
class DatabaseStore implements DataStore {
save(data: string): void {
console.log(`Saving ${data} to database`);
}
}
// 实现类:文件存储
class FileStore implements DataStore {
save(data: string): void {
console.log(`Saving ${data} to file`);
}
}
高层模块
// 高层模块:数据处理器,依赖于抽象的 DataStore
class DataProcessor {
private store: DataStore;
constructor(store: DataStore) {
this.store = store;
}
process(data: string): void {
// 处理数据
this.store.save(data);
}
}
换一个存储实现
const databaseStore = new DatabaseStore()
const dataProcessor1 = new DataProcessor(databaseStore)
dataProcessor1.process('data1') // Saving data1 to database
const fileStore = new FileStore()
const dataProcessor2 = new DataProcessor(fileStore)
dataProcessor2.process('data2') // Saving data2 to file
类图

体现依赖倒置原则的设计模式
- 工厂模式(Factory Pattern):通过使用工厂类来创建实例,而不是在代码中直接 new 一个对象,这样就把对象的创建和使用分离开了,高层模块(使用对象的模块)不依赖于低层模块(对象的具体实现),两者都依赖于抽象(产品接口)。
- 策略模式(Strategy Pattern):定义了一系列算法,并将每一种算法封装起来,让它们可以互相替换,此模式使得算法的变化独立于使用算法的客户。
- 依赖注入(Dependency Injection,是一种机制,而非严格意义上的设计模式):依赖注入是实现依赖倒置原则的重要方式,它允许创建依赖关系的外部实体,并通过构造函数、属性或方法将对象传递给依赖对象。
组件库与框架解耦
- 组件库与框架的解偶:在使用React、Vue等框架时,经常会使用到第三方UI组件库,如Ant Design、Vuetify等。通过抽象组件接口而不是直接依赖具体实现,可以在不改动业务代码的前提下更换组件库。
- 数据请求与处理的解耦:前端应用通常需要从服务器获取数据。通过定义抽象的数据服务接口,高层的UI组件不直接依赖于Axios、Fetch等具体实现,便于日后替换请求库或者改动请求逻辑。
- 插件系统:在一些复杂的SPA(单页应用)中,可采用插件系统对功能进行拓展。插件和应用核心之间通过定义好的接口交互,确保了应用的核心逻辑与插件的实现之间的独立性。
InversifyJS:一个依赖注入容器
- InversifyJS:是一个轻量级的依赖注入容器,用于TypeScript和JavaScript应用,它通过注解来实现依赖的注入,遵循了依赖倒置原则。
- Angular的依赖注入(DI)系统:Angular框架内建了一个依赖注入系统,它允许开发者将依赖项作为参数传递给组件或服务的构造函数中,从而实现高低层模块之间的解耦。
Keep Reading