面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度,提高扩展性
控制反转 IOC
Inversion of Control
通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。
也可以说,依赖被注入到对象中。
控制反转是一种思想,依赖注入是一种设计模式
来源: https://www.juyifx.cn/article/678531135.html
实现:
(1)依赖查找(是一种更加传统的 IOC 实现方式)
依赖容器和标准 api 实现,容器中的受控对象通过容器的 API 来查找自己所依赖的资源和协作对象
缺点: 无法在容器外使用和测试对象
查找的过程是 从集中注册表中 进行的
查找的过程是在 容器管理的资源中 进行的
(2)依赖注入 DI Dependency-injection-in-JavaScript
1
栗子01:
console.log(‘\n******************** test ********************‘); (function() { // 球队信息 class RocketTeam { public name: string; constructor() { this.name = ‘火箭‘ } } // 球员信息 class Player { public team: RocketTeam; constructor() { this.team = new RocketTeam() } getTeamInfo() { console.log(this.team.name) } } let ym = new Player(); ym.getTeamInfo(); // 火箭 })(); console.log(`******************** over \n\n 作者:潇湘待雨 链接:https://juejin.im/post/6844903698376720398 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ********************`);
假如这个时候, 球员发生交易了,球队信息更换了,转换到 FireTeam了。
这时候我们就需要去修改 Player 里的代码了,因为 Player 那里直接写死了对 RocketTeam 的依赖
重新思考下依赖关系处理:
一个球员对应一个球队的话,未来会发生变化的可能性太大了,毕竟不止一个球队。
哪支球队控制权应该直接落在 Player 这里了,这正是 IOC 的设计思路
根据 IOC 原则 进行改进(目的: 降低耦合,提高扩展性)
(1)高层模块不应该依赖低层模块
这里 Player 是高层模块,直接依赖了 RocketTeam 这个低级模块。
所以我们将两者解耦,Player不再直接依赖于该 RocketTeam 这个 class
(2)抽象不应该依赖具体实现,具体实现应该依赖抽象
Player 模块不应该直接依赖具体 RocketTeam,而是通过构造函数将抽象的 TeamInfo 实例传递进去,这样就解耦具体实现
(3)面向接口编程,而非面向实现编程
console.log(‘\n******************** test ********************‘); (function() { // 球队信息 class TeamInfo { public name: string; constructor(name: string) { this.name = name } } // 球员信息 class Player { public team: TeamInfo; constructor(team: TeamInfo) { this.team = team } getTeamInfo() { console.log(this.team.name) } } // 将依赖关系放到此处来管理,控制权也放到此处 // Player 和 TeamInfo 之间不再有直接依赖:Player 不再直接依赖掌握 TeamInfo 的控制权 // 将依赖控制,落在此处(第三方模块专门管理)即为控制反转 let ym = new Player(new TeamInfo(‘火箭‘)); ym.getTeamInfo(); const kobe = new Player(new TeamInfo(‘湖人‘)); kobe.getTeamInfo(); })(); console.log(`******************** over \n\n 作者:潇湘待雨 链接:https://juejin.im/post/6844903698376720398 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ********************`);
这样再增加一个 team3,改动也不大,复用就行了。
依赖注入
依赖注入
依赖注入
依赖注入
依赖注入
依赖注入
原文:https://www.cnblogs.com/tianxiaxuange/p/13935872.html