JAVA设计模式十八:--Facade(外观模式或门面模式)

来源:互联网 发布:sql 更改字段属性 编辑:程序博客网 时间:2024/04/30 02:03
Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。

Facade模式概述
        实际应用中,我们在对付一些老旧的code(尤其是将C的代码转成C++代码)或者即便不是老旧code,但涉及多个子系统时,除了重写全部代码
    (对于老旧code而言),我们还可能采用这样一种策略:重新进行类的设计,将原来分散在源码中的类/结构及方法重新组合,形成新的、统一的接口,
    供上层应用使用。
        这在某种意义上与Adapter及Proxy有类似之处,但是,Proxy(代理)注重在为Client-Subject提供一个访问的中间层,如CORBA可为应
    用程序提供透明访问支持,使应用程序无需去考虑平台及网络造成的差异及其它诸多技术细节;Adapter(适配器)注重对接口的转换与调整;而
    Facade所面对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面。
Facade模式应用
    在遇到以下情况使用Facade模式:
          1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系
            统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。
          Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
          2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移
        植性。
          3、当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让它们仅通过Facade
        进行通讯,从而简化了它们之间的依赖关系。

Facade模式优缺点
    Facade模式有下面一些优点:
      1、它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
      2、它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
      松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以
    消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。
      在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较
    小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。

      3、如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

图实例:

举例代码:

[java] view plaincopyprint?
  1. package design.facade;  
  2.   
  3. /** 
  4.  * 文件名称:ServiceA.java 
  5.  * 创建人:Fei Wong 
  6.  * 创建时间: Jun 29, 2012 
  7.  * 电子邮箱:feiwong8@126.com 
  8.  * */  
  9.   
  10. public interface ServiceA {  
  11.     /** 
  12.      * ServiceA 的A方法  
  13.      * */  
  14.     public void methodA() ;  
  15. }  
  16.   
  17.   
  18.   
  19. package design.facade;  
  20.   
  21. /** 
  22.  * 文件名称:ServiceAImpl.java 
  23.  * 创建人:Fei Wong 
  24.  * 创建时间: Jun 29, 2012 
  25.  * 电子邮箱:feiwong8@126.com 
  26.  * */  
  27.   
  28. public class ServiceAImpl implements ServiceA {  
  29.   
  30.     /* (non-Javadoc) 
  31.      * @see design.facade.ServiceA#methodA() 
  32.      */  
  33.     @Override  
  34.     public void methodA() {  
  35.         System.out.println( "methodA--> is runing" );   
  36.     }  
  37.   
  38. }  
  39.   
  40.   
  41.   
  42. package design.facade;  
  43.   
  44. /** 
  45.  * 文件名称:ServiceB.java 
  46.  * 创建人:Fei Wong 
  47.  * 创建时间: Jun 29, 2012 
  48.  * 电子邮箱:feiwong8@126.com 
  49.  * */  
  50.   
  51. public interface ServiceB {  
  52.     /** 
  53.      * ServiceB 的B方法 
  54.      * */  
  55.     public void methodB() ;  
  56. }  
  57.   
  58.   
  59.   
  60. package design.facade;  
  61.   
  62. /** 
  63.  * 文件名称:ServiceAImpl.java 
  64.  * 创建人:Fei Wong 
  65.  * 创建时间: Jun 29, 2012 
  66.  * 电子邮箱:feiwong8@126.com 
  67.  * */  
  68.   
  69. public class ServiceBImpl implements ServiceB {  
  70.       
  71.   
  72.     /* (non-Javadoc) 
  73.      * @see design.facade.ServiceA#methodA() 
  74.      */  
  75.     @Override  
  76.     public void methodB() {  
  77.         System.out.println( "methodB--> is runing" );   
  78.     }  
  79.   
  80. }  
  81.   
  82.   
  83.   
  84. package design.facade;  
  85.   
  86. /** 
  87.  * 文件名称:ServiceC.java 
  88.  * 创建人:Fei Wong 
  89.  * 创建时间: Jun 29, 2012 
  90.  * 电子邮箱:feiwong8@126.com 
  91.  * */  
  92.   
  93. public interface ServiceC {  
  94.     /** 
  95.      * ServiceC 的C方法 
  96.      * */  
  97.     public void methodC() ;    
  98. }  
  99.   
  100.   
  101.   
  102. package design.facade;  
  103.   
  104. /** 
  105.  * 文件名称:ServiceAImpl.java 
  106.  * 创建人:Fei Wong 
  107.  * 创建时间: Jun 29, 2012 
  108.  * 电子邮箱:feiwong8@126.com 
  109.  * */  
  110.   
  111. public class ServiceCImpl implements ServiceC {  
  112.       
  113.   
  114.     /* (non-Javadoc) 
  115.      * @see design.facade.ServiceA#methodA() 
  116.      */  
  117.     @Override  
  118.     public void methodC() {  
  119.         System.out.println( "methodC--> is runing" );    
  120.     }  
  121.   
  122. }  
  123.   
  124.   
  125.   
  126. package design.facade;  
  127. /** 
  128.  * 文件名称:Facade.java 
  129.  * 创建人:Fei Wong 
  130.  * 创建时间: Jun 29, 2012 
  131.  * 电子邮箱:feiwong8@126.com 
  132.  *  
  133.  * 外观模式 核心类 
  134.  * */  
  135.   
  136. public class Facade {  
  137.     ServiceA sa;  
  138.     ServiceB sb;  
  139.     ServiceC sc;  
  140.   
  141.     public Facade() {  
  142.         sa = new ServiceAImpl();  
  143.         sb = new ServiceBImpl();  
  144.         sc = new ServiceCImpl();  
  145.     }  
  146.   
  147.     public void methodA() {  
  148.         sa.methodA();  
  149.         sb.methodB();  
  150.     }  
  151.   
  152.     public void methodB() {  
  153.         sb.methodB();  
  154.         sc.methodC();  
  155.     }  
  156.   
  157.     public void methodC() {  
  158.         sc.methodC();  
  159.         sa.methodA();  
  160.     }  
  161.       
  162. }  
  163.   
  164.   
  165.   
  166. package design.facade;  
  167.   
  168. /** 
  169.  * 文件名称:Client.java 
  170.  * 创建人:Fei Wong 
  171.  * 创建时间: Jun 29, 2012 
  172.  * 电子邮箱:feiwong8@126.com 
  173.  * */  
  174.   
  175. public class Client {  
  176.   
  177.     /** 
  178.      * @param args 
  179.      */  
  180.     public static void main(String[] args) {  
  181.         ServiceA sa = new ServiceAImpl();  
  182.           ServiceB sb = new ServiceBImpl();  
  183.           sa.methodA();  
  184.           sb.methodB();  
  185.           System.out.println("=====================");  
  186.           Facade f = new Facade();  
  187.           f.methodA();  
  188.           f.methodB();  
  189.           f.methodC() ;  
  190.     }  
  191.   
  192. }  
原创粉丝点击