设计原则--好莱坞原则

yanglin 2015-07-15

      “不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。

   好莱坞,一个让许多俊男靓女欲罢不能的地方。在通往成功的路上,有谁不愿意通过捷径而一炮而红,在这之中影视声色是许多人会尝试的方式之一。 
     不过,好莱坞不是一般的场所,它不是什么阿猫阿狗都可以进入的地方,他们不缺少俊男靓女。因此,如果你有一双俊俏的脸庞,你不要在他们面前显摆,他们不在乎。你可能会说,我的演技非常棒,哦,没用,这样的人在好莱坞遍地都是。 
     梦想进入好莱坞的人们,你们不要找好莱坞。那怎么办呢?答案是,让好莱坞来找你! 
这就是非常著名的好莱坞原则。

   模板方法模式充分的体现了“好莱坞”原则。IOC是Inversion of Control的简称,IOC的原理就是基于好莱坞原则,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。

所有的framework都是遵循好莱坞原则设计的,否则就不叫framework。framework使用IoC的目的:
1.对基于接口编程的支持 
2.减少单件和抽象工厂的依赖 
3.降低业务和框架的耦合 
4.业务组件可复用,可插拔

依赖注入(IoC)

     

      如果对象A包含对象B的话,就需要在A里new一个B 
      依赖注入从具体类B里抽象出接口IB——IB的具体实现可能有很多B,B1,B2…很多种——这样A可以不用再new具体的B了,而是跟IoC容器说:我要一个IB(getBean("IB"))。然后,由容器根据配置文件来做具体的new的工作。具体new的是哪个,由配置文件从代码外部决定,要更换成B,B1,或是B2…修改配置文件就能做到,不用再改代码了

例:
假设你编写了两个类,一个是人(Person),一个是手机(Mobile)。 
人有时候需要用手机打电话,需要用到手机的dialUp方法。 
传统的写法是这样:

//code
public class Person{ 
    public boolean makeCall(long number){ 
        Mobile mobile=new Mobile(); 
        return mobile.dialUp(number); 
    } 
}

     也就是说,类Person的makeCall方法对Mobile类具有依赖,必须手动生成一个新的实例new Mobile()才可以进行之后的工作。 
依赖注入的思想是这样,当一个类(Person)对另一个类(Mobile)有依赖时,不再该类(Person)内部对依赖的类(Moblile)进行实例化,而是之前配置一个beans.xml,告诉容器所依赖的类(Mobile),在实例化该类(Person)时,容器自动注入一个所依赖的类(Mobile)的实例。

 
接口:

//code
public Interface MobileInterface{ 
    public boolean dialUp(long number);
}

 Person类:

//code
public class Person{
    private MobileInterface mobileInterface;
    public boolean makeCall(long number){
        return this.mobileInterface.dialUp(number);
    }
    public void setMobileInterface(MobileInterface mobileInterface){
        this.mobileInterface=mobileInterface;
    }
}

在xml文件中配置依赖关系

//code
<bean class="Person" id="person">
     <property name="mobileInterface">
         <ref local="mobileInterface"></ref>
     </property>
</bean> 
<bean class="Mobile" id="mobileInterface"></bean>

  

    这样,Person类在实现拨打电话的时候,并不知道Mobile类的存在,它只知道调用一个接口MobileInterface,而MobileInterface的具体实现是通过Mobile类完成,并在使用时由容器自动注入,这样大大降低了不同类间相互依赖的关系。

相关推荐