说起Spring,总是要难免说起控制反转。最近由于项目需要使用Spring,所以看了一些IoC的资料。为了加深理解,写写自己的想法。希望和大家探讨。

   设计有一个重要的法则是面向接口编程。面向接口编程可以使我们摆脱对具体实现的依赖,当具体实现由于需求变动需要修改时,我们只需要给出新的接口实现,而不需修改程序的其他部分。如果仔细分析,很多的设计模式都是依赖于接口的。下面是一个关于接口的例子:

public interface Cooker{
    
public String cook();
}

public Class HangzhouCooker{
    
public String cook(){
        
return "叫花鸡";
    }
}

public Class Restaurant{
    
public Cooker = new HangzhouCooker();
   
    
public String serve(){
        Cooker.cook();
    }
}

   如例子所示,这是一个饭店的模拟程序。接口Cooker是饭店雇的厨师的模型,厨师只有一项Cook的手艺,不同的厨
师只是Cook的实现不同,但是都是在Cook。HangzhouCooker是Cooker的一个实现,代表当前Restaurant雇佣的厨师是一位杭州厨子,他会做叫花鸡这道菜。Restaurant类描述整个饭店,它可以为客人提供Serve这一服务,内容就是由其雇佣的厨师烧一道菜给顾客。系统运行的一直不错。但是有一天饭店的杭州厨子被解雇了——因为一个挑剔的顾客抱怨整天吃鸡太烦了。于是店长雇了一个保定厨子来做驴肉火烧给大家吃,这时候显然系统需要修改。那么我们现在要做哪些修改呢?

  首先我们给Cooker接口新的实现:

public Class BaodingCooker{
    
public String cook(){
        
return "驴肉火烧";
    }
}

但是现在只系统还不能正确运行,因为我们还没有把正确的Cooker加载(雇)进来。所以我们要修改

public Cooker = new HangzhouCooker();

这一行代码。

    由例子不难看出通过面向接口编程,在一定程度上降低了模块间的耦合程度,使得程序可以通过扩展的方式比较方便的修改。但是即便采用面向对象的方式,我们仍然不能实现模块之间完全的解耦合。从例子中可以看Restaurant的Cooker子类加载部分仍然需要修改。也许我们可以使用诸如工厂模式的设计方法来转移控制,但是控制只是被或者转移了。而控制反转改变了这种情况,控制反转中的控制就是只的对象的创建。通过将对象的创建过程反转(不再由使用者创建)模块只需要实现自己的功能就行了,不依赖于任何实现相关的东西——只是纯粹的依赖于接口。控制反转的一种典型实现方式是依赖注入——就是将依赖的对象诸如到对象当中去。在上面的例子中就是将Cooker对象由框架注入到Restaurant中去,这时候Restaurant中只有一个Cooker类型的接口,至于具体是什么样的厨子,由框架加载进来。这样Restaurant和***Cooker就解耦了。

   综上所述,控制反转理论实际上是面向接口编程的延伸,符合开闭和里氏代换等原则。

   至于如何实现实现依赖注入,大家可以去查看Spring或者其他框架,这里不做说明。
posted on 2009-03-16 21:20 王家忙 阅读(1589) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: