zoukankan      html  css  js  c++  java
  • IOC给程序带来的好处

     IOC(inversion of control)的中文解释是“控制反转”或者“依赖注入”,它的实现目的是:我们可以通过配置文件来控制程序的流程,达到程序代码的优化。初学者往往弄不清楚为什么我们可以通过“控制反转”或“依赖注入”来优化我们的代码。今天我想借这个机会说说我对IOC程序设计原则的认识,以及它是怎么样把我们的程序弄“活”的。
    一、名词解释 
    首先我想说说我对“控制反转”和“依赖注入”的认识。
         1、控制反转:
         对于初学者来说,我们平时写代码,“一段代码会完全控制了程序的流程”,因为我们习惯于用new关键字来创建对象,再通过对象来调用它的方法。对于我们来说,这是再正常不过的了,可是如果此时我们的需求发生了一点改变,我们就不得不修改源代码,这就是我们常讲的“硬编码(hard-coding)”,而修改源代码是程序设计的大忌,这违反了程序设计的“开闭原则”,即对扩展是开放的,对修改是关闭的。

    Java代码  
    1. //代码示例:  
    2. public class Animal {  
    3. public void eat() {  
    4.         System.out.println(" 动物 吃东西了!");  
    5.     }  
    6. }  
    7. public class Pig extends Animal{  
    8. public void eat() {  
    9.         System.out.println(" 小猪 吃东西了!");  
    10.     }  
    11. }  
    12. public class Dog extends Animal {  
    13. public void eat() {  
    14.         System.out.println(" 小狗 吃东西了!");  
    15.     }  
    16. }  
    17. public class Project {  
    18.     public static void main(String[] args) {  
    19.         Animal pig = new Pig();  
    20.         pig.eat();  
    21.     }  
    22. }  

         当我们写完代码时,我们的程序只能执行小猪吃东西,可是如果此时需求要求我们要小狗吃东西,是不是我们的代码又要变了呢。此时我们引入了配置文件,我们事先在配置文件中已经配置好了该是谁吃东西,等到程序运行时,程序会读取配置文件中的值通过反射机制创建一个我们需要的对象,再调用它的eat方法就ok了。这样看来,我们程序的执行流程控制权是不是转交给了配置文件了呢,而程序代码自己却成了被控制的对象,这就是实现了“控制反转”了。
          2、依赖注入:
    在讲依赖注入之前,我想先讲一讲依赖注入的三种实现方式。
    (1)构造注入, 是通过构造器方法注入实例变量

    Java代码  
    1. public class Car {  
    2. public void move(){  
    3.         //••••  
    4.     }  
    5. }  
    6. public class People {  
    7.     private Car car;  
    8.     public People(Car car) {//构造注入  
    9.         this.car=car;  
    10.     }  
    11.     public void move(){  
    12.         car.move();  
    13.     }  
    14. }  

     (2)设值注入,是通过setter方法注入实例变量

    Java代码  
    1. public class People {  
    2.     private Car car;  
    3.     public People(Car car){//构造注入  
    4.         this.car=car;  
    5.     }  
    6.     public void setCar(Car car) {//设置注入  
    7.         this.car = car;  
    8.     }  
    9.     public void move(){  
    10.         car.move();  
    11.     }  
    12. }  

     (3)接口注入,是通过接口方法注入实例变量

    Java代码  
    1. public interface AbstractCar {  
    2.     public void move();  
    3. }  
    4. public class Car {  
    5. public void move(){  
    6.         System.out.println("车开了");  
    7.     }  
    8. }  
    9. public interface AbstractPeople {  
    10.     public void move();  
    11. }  
    12. public class People {  
    13. public void move(AbstractCar car){//接口注入  
    14.         car.move();  
    15.     }  
    16. }  

    问题思考:依赖注入有什么作用呢?
          此时我们还无法回答这个问题,可是当我们考虑到配置文件时,我们就豁然开朗了,不管是哪种注入方法,目的都是给我们的程序传入一个实例变量。而这个实例变量我们可以事先在配置文件中配置,当程序运行时就可以读取配置文件,通过反射机制来创建所需的对象了,如果此时我们的需求发生了变化,我们也只需改一下配置文件就ok了。这里有些人可能会认为这也修改了文件呀,为什么修改配置文件就可以了呢。呵呵,其实配置文件是不需要编译的,我们可以随时修改配置文件,而不需要通过更改一行源代码的方法就实现了程序流程的控制。这就是ICO的妙处哦~
          3、IOC容器
    使用IOC后,我们不需要自己去创建某个类的实例,而由IOC容器去创建,当我们需要使用某个对象时,直接到容器中去获取就可以了。现在已经有许多非常优秀的IOC容器,比如spring等。
     二、综合理解 
           最后我想用一个图来表示我对IOC的理解

    转自:http://weixiaolu.iteye.com/blog/1244865

  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/sh425/p/6893512.html
Copyright © 2011-2022 走看看