【java设计模式】外观模式

转载自:http://blog.csdn.net/hfmbook/article/details/7702642

JAVA设计模式十九--Facade(外观模式)

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、如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

图实例:

1340954983_5670.png

  1. package design.facade;  

  2.   

  3. /** 

  4.  * 文件名称:ServiceA.java 

  5.  * 创建人:Fei Wong 

  6.  * 创建时间: Jun 29, 2012 

  7.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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.  * 电子邮箱:[email protected] 

  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. }  


你可能感兴趣的:(java,设计模式,外观模式)