学习地址:腾讯课堂   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容器

最新文章

  1. sparkR读取csv文件
  2. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)
  3. [系统开发] Python 实现的 Bind 智能 DNS Web 管理系统
  4. ubuntu下nginx的启停等常用命令
  5. python学习笔记3(字符串)
  6. hdu 5012 Dice
  7. android代码集锦
  8. 眼花缭乱的UI,蓝牙位于何方
  9. 移动前端不得不了解的HTML5 head 头标签(中下篇)
  10. hibernate中Query的list和iterator区别
  11. os x下如何挂载iso镜像
  12. MyBatis3系列__06查询的几点补充
  13. JavaScript学习(三)
  14. P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)
  15. service层代码相互调用, 导致spring循环依赖,设计上的优化
  16. Day Four
  17. ES6学习笔记(二):引用数据类型
  18. mybatis的面试一对一,一对多,多对多的mapper.xml配置
  19. Programmed Adjustable Power
  20. 为autoLayout 增加标识符,方便调试

热门文章

  1. JavaSE---JDK提供的命令行工具---javap
  2. 【leetcode】905. Sort Array By Parity
  3. Halo(十一)
  4. Java反射学习-5 - 反射复制对象
  5. Dataphin数据服务系列之--API 配置、管理和消费
  6. django+nginx+uwsgi_cent0s7.4 部署
  7. Codechef BINOMSUM
  8. 查看电脑的s/n序列号信息方式
  9. 二次封装arcgis的timeslider
  10. meta标签 使用说明(http-equiv、refresh、seo)