首页 > 其他 > 详细

【分享01】控制反转 IOC

时间:2020-11-06 11:56:25      阅读:31      评论:0      收藏:0      [点我收藏+]

面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度,提高扩展性

控制反转 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,改动也不大,复用就行了。

 

技术分享图片

 

 

 

 

依赖注入

依赖注入

依赖注入

依赖注入

依赖注入

依赖注入

【分享01】控制反转 IOC

原文:https://www.cnblogs.com/tianxiaxuange/p/13935872.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!