🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 依赖倒置原则 ### 理解概念 含义:依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。(来自百度百科) 关键: 高层模块不应该依赖低层模块,两者都应该依赖其抽象 抽象不应该依赖细节 细节应该依赖抽象 目的:避免需求变化导致过多的维护工作 解释:简单来说就是程序要依赖于抽象接口,不要依赖于具体实现。要求对抽象进行编程,不要对实现进行编程。 ~~~js const test = { getValue() { return 1; } }; const other = { getVal() { return 10; } }; class SimpleMath { calc(obj) { console.log(obj.getValue() + 100); } }; const s = new SimpleMath(); s.calc(test); // 101 s.calc(other); // 错误 ~~~ 这个错误是显而易见的, other底层类并不具备getValue方法, 所以报错, 我们当然可以修改other让其具备getValue, 可这样难保其他类似的情况, 这里有一个问题, SimpleMath类实例的calc方法与底层对象产生了一个强耦合, 必须具备getValue方法的对象才能传入calc方法, 这就违背了依赖倒置原则的高层模块不依赖底层模块, 所以更好的做法是消除该依赖 ~~~js const test = { getValue() { return 1; } }; const other = { getVal() { return 10; } }; class SimpleMath { calc(getValue) { console.log(getValue() + 100); } }; const s = new SimpleMath(); s.calc(test.getValue); // 101 s.calc(other.getVal); // 110 ~~~ 举个栗子: 现有一个人类,人类有一个读书的接口,因为是读书,所以要依赖一个书类的输出书内容的方法。这就违反了依赖倒置原则,因为你此时人类是高层模块,书是低层模块,高层模块人类依赖了低层模块书类。此时如果要让人类去读报纸,原有的读书方法很难做到。 解决: ~~~ // 阅读类 class Reader{ constructor(content) { this.content = content } // 获取内容的抽象方法 outPutContent(){ throw "Abstract methods require concrete implementation"; }     } // 书类 class Book extends Reader{ constructor(content) { super(content) } // 获取内容的抽象方法的实现 outPutContent(){ console.log(`书的内容是${this.content}`) } } // 报纸类 class NewsPaper extends Reader{ constructor(content) { super(content) } // 获取内容的抽象方法的实现 outPutContent(){ console.log(`报纸的内容是${this.content}`) } } // 人类 class People{ constructor(name) { this.name = name } // 读抽象方法的具体实现 reader(what){ console.log(`${this.name}读的`,what.outPutContent()) }     } let xiaoMing = new People('小明') let xiaoHong = new People('小红') let anTuSheng = new Book('安徒生故事') let wanBao = new NewsPaper('今日晚报') xiaoMing.reader(anTuSheng);// 书的内容是安徒生故事 小明读的 xiaoMing.reader(wanBao);// 报纸的内容是今日晚报 小明读的 xiaoHong.reader(anTuSheng);// 书的内容是安徒生故事 小红读的 xiaoHong.reader(wanBao);// 报纸的内容是今日晚报 小红读的 ~~~ 以上就实现了实现了依赖倒转原则。