java设计模式之Facade模式

来源:互联网 发布:python gnureadline 编辑:程序博客网 时间:2024/05/21 10:47
关于Facade模式,有人翻译为外观模式,有人翻译为门面模式。我最早接触这种设计模式是在杭州的时候,那个时候服务端的Facade层主要有2个作用,一个是提供给Flex客户端的接口用。一个是作为包含多个service操作的统一接口。GoF《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。其实大多数人对于Facade层的理解是为多个复杂的动作提供一个入口。

来看一个网上广为流传的例子:

比如有一个抽屉,里面存放了很大的重要文件,我们称这个抽屉为第二个抽屉,它的钥匙放在另一个抽屉,我们称之为第一个抽屉,只有拿到第一个抽屉里的钥匙,才能打开第二个抽屉。

[java] view plaincopy
package com.howlaa.facadeMode;  
  
/** 
 *  抽屉一 
 * @author howlaa 
 */  
public class DrawerOne {  
    public String open(){  
        System.out.println("第一个抽屉打开...");  
        return getKey();  
    }  
    public String getKey(){  
        System.out.println("得到第二个抽屉的钥匙...");  
        return "钥匙";  
    }  
}  
[java] view plaincopy
package com.howlaa.facadeMode;  
  
/** 
 * 抽屉二  
 * @author howlaa 
 */  
public class DrawerTwo {  
    public void open(String key){  
        if("钥匙".equals(key)){  
            System.out.println("第二个抽屉打开...");  
            getFile();  
        }else  
        {  
            System.out.println("钥匙不匹配,不法打开第二个抽屉...");  
            return ;  
        }  
          
    }  
    public void getFile(){  
        System.out.println("取得重要文件...");  
    }  
}  

 

现在我们来看下,当不使用Facade模式时,客户端如果用户想拿到这个重要文件是怎样的:

[java] view plaincopy
package com.howlaa.facadeMode;  
  
import org.junit.Test;  
  
/** 
 * 客户端 
 * @author howlaa 
 * 
 */  
public class Client {  
    /*-------当未使用Facade模式时---------*/  
    @Test  
    public void NotUseFacade(){  
        DrawerOne drawerOne = new DrawerOne();  
        String key = drawerOne.open();  
        DrawerTwo drawerTwo = new DrawerTwo();  
        drawerTwo.open(key);  
    }  
    /*-------end 未使用Facade模式---------*/  
}  

 

可以看到,用户必须先去打开第一个抽屉,才能用这个钥匙去打开第二个抽屉。在实际中,可能用户不知道这个必要条件。他只知道他需要的就是打开抽屉,然后拿到文件。我们来看下使用Facade模式时的状况:

首先,我们需要新建一个Facade类:

[java] view plaincopy
package com.howlaa.facadeMode;  
  
public class DrawerFacade {  
    DrawerOne drawerOne = new DrawerOne();  
    DrawerTwo drawerTwo = new DrawerTwo();  
    public void open(){  
        String key = drawerOne.open();  
        drawerTwo.open(key);  
    }  
}  

然后看下客户端的操作:

[java] view plaincopy
package com.howlaa.facadeMode;  
  
import org.junit.Test;  
  
/** 
 * 客户端 
 * @author howlaa 
 * 
 */  
public class Client {     
    /*--------使用Facade模式--------------*/  
    @Test  
    public void UseFacade(){  
        DrawerFacade drawerFacade = new DrawerFacade();  
        drawerFacade.open();  
    }  
    /*--------end 使用Facade模式----------*/  
}  

这里可以看到,客户端的用户只是做了打开,拿文件的操作。服务端怎么操作的,他无须关心。


本文来源: http://blog.csdn.net/howlaa/article/details/12775077