zoukankan      html  css  js  c++  java
  • DIP、IOC、DI

    定义

    DIP(Dependence Inversion Principle):依赖(就是用到涉及到)倒置原则,高层模块(抽象层级较高,包括的范围较广,比较抽象)依赖底层模块的具体事物,底层发生变动的时候会牵连到高层,这是耦合很重的设计,破坏了开闭原则,而高层模块依赖抽象,底层模块同样依赖抽象(通过抽象在高低层之间通信,没有直接的依赖,都依赖抽象,当然抽象本身应该要是稳定的)就会避免这样的问题,总结为第一条规则:高层模块不应该依赖低层模块,他们都应该依赖抽象。倒置一说就是避免人的惯性思维带来的耦合重的缺点,让原本依赖具体的思维方式改成依赖抽象,总结为第二条规则:抽象不依赖具体,而具体依赖抽象。

    IOC(Inversion of Control):控制反转,为两个相互依赖的组件提供抽象,将底层依赖的对象(来自高层)交给第三方系统来控制,引入了第三方控制系统,而不是普通的通过NEW的方式来获取对象。

    DI(Denpdency Injection):依赖注入,将依赖对象的创建放到被依赖对象外部实现。把依赖关系包装到构造函数或者其他方法中,通过这种在外部提供内部依赖对象的方式,好像从外往里面注入了依赖对象。注入的方式有很多,构造函数,通过构造函数传参将依赖对象注入进去;属性注入,通过设置对象的属性来注入依赖对象;接口注入,提供一个具有注入依赖对象的方法契约的接口,被依赖的对象实现该接口,并且调用接口方法设置依赖对象。前面集中是手动方式设置依赖对象,通过IOC容器动态创建注入依赖对象,IOC容器有以下功能:动态创建、注入依赖对象;管理对象生命周期;映射依赖关系,如下:

    public class FacadeFactory
        {
            public static T GetObject<T>() where T : IBaseFacade
            {
                IApplicationContext ctx = ContextRegistry.GetContext("Promocode.Facade");
                return (T)ctx.GetObject(typeof(T).Name);            
            }
        } //这是IOC容器
     
    //这是抽象与具体的映射(依赖)关系
    <object id="IMyCouponFacade" type="Payment.Promocode.Facade.MyCouponFacade, Payment.Promocode.Facade" />
    <object id="IMyCouponBackManagerFacade" type="Payment.Promocode.Facade.MyCouponBackManagerFacade, Payment.Promocode.Facade" />

    区别与联系

    DIP是软件设计原则,告诉我们的是对错,不是具体如何做,IOC是设计模式,是软件开发中总结出来的可重用的解决方案,可以解决一些实际问题。DI是IOC的具体实现方式之一,IOC容器是DI构造注入的框架。

     
    同时可以对比看 angularjs的依赖注入:
    参考:http://blog.csdn.net/renfufei/article/details/19038123 
     
  • 相关阅读:
    mysql 查询每个分组前N条记录
    MLlib 卡方检验
    还好,我还在路上
    从浏览器渲染原理,浅谈回流重绘与性能优化
    基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件
    Vue2.0结合webuploader实现文件分片上传
    在Vue2.0中集成UEditor 富文本编辑器
    深入研究-webkit-overflow-scrolling:touch及ios滚动
    JS对象的截取和合并
    CSS变量--CSS和JavaScript的桥梁
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/4316412.html
Copyright © 2011-2022 走看看