首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

IOC设计形式的理解

2012-10-31 
IOC设计模式的理解IOC全称是Inversion of Control,即反转控制,或者说是依赖注入更为合适。选择别纠结这些全

IOC设计模式的理解
  IOC全称是Inversion of Control,即反转控制,或者说是依赖注入更为合适。选择别纠结这些全称的专业词。我们可以用别外一些方式去理解它,IOC,是一种设计模式。它的延生所要实现的是把藕合从代码中移出去,统一放到XML文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了。

    IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实 际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
   看了这些,头晕没?

   没关系,继续。IOC中最基本的Java技术就是“反射”编程,至天反射机制,可以查看我的另一篇《java中的反射机制》.如果你理解了反射,你就知道,IOC,就是为了动态的创建对象,而不是在代码中写死去生成某一种特定的对象。通过IOC模式,我们可以通过改变XML上的配置文件,去改变各种的依赖关系。每当IOC容器去读取XML文件后,就会根据给出了的类名来生成对象。所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCIS硬盘了)。

下面来说说IOC的缺点吧,了解其缺点可以更进一步的了解其用法。
  1)生成一个对象的步骤变复杂了(其实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象 生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3) 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

  说了那么多,都晕了吧。呵呵,再坚持一下啊,我们胡老师给我们讲的时候,我们也是这样的啊,可是,下面是大家最想看的嘛,嗯,下面是一些代码的附助讲解。

/* *  */public interface IVehicle { public void startMe();//启动 public int forward(int dins);//前进 //有多少油 public int getEnergy();}

//这就是核心代码....哈哈,别失望啊,是的,就是这么点代码。public static IVehicle createIVehicle(String className){try{IVehicle v = (IVehicle)Class.forName(className).newInstance();//这一句,在说到反射的时候就提过了,现在再出现,足可见其重要性,我确实感觉到其强大,只要给我一个存在的类名,我就可以返回你一个实例,有了实例,你想操作什么都行哦`return v;}catch(Exception ef){ef.printStackTrace();}return null;}


  下面再讲讲IOC模式的三种注入,包抱Setter注入,构造注入(代理对象),以及接口注
由于Spring并不支持接口注入,而我们接下来的项目将用到Spring这种实现了IOC模式的容器,所以,接口注入就不说了,想知道的话,baidu,google,bing都行。
[//构造注入class BigBm implements IVehicle{private IVehicle v;//带参构造器,每创建一个BigBm对象,就必须传入一个IVehicle对象    public BigBm(IVehicle v){    this.v = v;    }     public void startMe(){ System.out.println("启动了.."); v.startMe(); } public  void test(IVehicle v){ BigBm b = new BigBm(v); b.startMe(); }}


//Setter注入public class classA{private classsB b;public void Setter(classsB b){this.b = b;}public void doSomething(){System.out.println("注入了!!");}}public class classB{}public class text{  public static void main(String args[]){classB b = new classB();classA a = new classA();a.Setter(b);a.doSomething();}}

热点排行