zoukankan      html  css  js  c++  java
  • 1.初步了解IOC容器

    学习地址:腾讯课堂   https://ke.qq.com/course/28986?_bid=167&_wv=3&from=iosapp

    1.什么是IOC容器
      定义:
        1.是一个可以把面向细节编程方式,转变为面向抽象编程方式的第三方容器(工厂模式差不多)

        2.可以用来自动化创建对象的容器(利用DI依赖注入和配置文件的手段来实现)

      遵循依赖倒置原则:
        高层不直接依赖底层的细节,而是通过抽象来依赖,也就是所谓的把面向细节编程变为面向抽象编程

      IOC控制反转:
        把高层对底层的依赖去掉,对象的控制权转移到第三方容器,让程序更具有扩展性

      DI依赖注入:
        实现IOC的一种手段,构造对象时,把依赖的对象自动创建并传入进去

      DI依赖注入的先后顺序:
        构造函数注入-->属性注入-->方法注入

    2.为什么要用IOC容器
      面向细节编程:
        当我们面向细节编程的时候,如果细节变化了(扩展了),那么高层也需要改变,程序中往往底层的细节是容易改变的,这样会导致程序架构不稳定(往往我们的程序是不止一层的)

      面向抽象编程:
        当我们面向抽象编程的时候,如果细节变化了(扩展了),高层时不需要改变,这样阻止了程序升级时的水波效应,使程序架构更加稳定

      例如(随便举例子):

        手机类如下:

    public class Iphone 
    {
         public void Play()
         {
              Console.WriteLine("我在玩iphone");
          }
    }
    
    public class VIVO 
    {
          public void Play()
          {
               Console.WriteLine("我在玩vivo");
          }
    }

        学生类如下:

    public class Student
    {
        public void Play(IMobile iphone)
        {
             iphone.Play();
         }
    
    } 

        现在我们创建一个学生,并让学生玩iphone(面向细节)

    //我们通过买一款iphone手机玩
    public Unity_Test1()
    {
        Student stu = new Student();
        Iphone iphone = new Iphone();
        stu.Play(iphone);
    }

        到后面这个学生想玩vivo手机了,不想玩iphone,那么我们需要改低层的 Play(Iphone iphone)方法,应为它接受的是一个Iphone类型的参数,同时我们还需要改Unity_Test1类中的代码

        我们可以使用多态来解决此问题

          先定义一个接口,并让上面2款手机继承此手机接口,并把

    public interface IMobile
    {
         void Play();
    }

          代码如下(多态:里氏替换原则):

    Student stu = new Student();
    IMobile iphone = new Iphone();
    stu.Play(iphone);

          想玩vivo手机了,不想玩iphone,这下我们只需要更改  IMobile iphone = new Iphone();   此句话即可

    public Unity_Test1()
    {
         Student stu = new Student();
         IMobile iphone = new VIVO();
         stu.Play(iphone);
    }

          注意:这里还是是依赖了细节(IMobile iphone = new VIVO();),并不满足依赖倒置原则(面向抽象,而不是面向细节)

    3.如何实现依赖倒置原则

      问题:

        不依赖细节,那么我们如何创建对象呢?

      

      解决:

        把创建对象的事情交给第三方去实现

      方式如下:

        1)使用工厂模式

        2)使用IOC容器

  • 相关阅读:
    PHP 创建二叉树镜像(交换左右子树)
    PHP 使用二叉树的先序和中序遍历结果构造二叉树
    PHP 不用求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
    PHP 不用加减乘除做加法
    PHP 跳台阶问题
    PHP 输入一个整数,求该整数的二进制表达中有多少个1
    PHP 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
    PHP 查找链表倒数第i个节点
    .Net/C# 实现: FlashFXP 地址簿中站点密码的加解密算法
    johnsuna 的收藏精品
  • 原文地址:https://www.cnblogs.com/zjdbk/p/10596469.html
Copyright © 2011-2022 走看看