设计模式之外观模式Facade(结构型)

来源:互联网 发布:有关孙悟空的网络电影 编辑:程序博客网 时间:2024/05/16 07:58

1. 概述

     外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。

2. 问题

为了降低复杂性,常常将系统划分为若干个子系统。但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?

3. 解决方案

外观模式:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。


4. 优缺点

Facade模式有下面一些优点:

1)对客户屏蔽子系统组件减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
2)实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
3)降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
4)只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
Facade模式的缺点
1) 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
2) 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”

5. 实现

  1. package design.service;  
  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.service.impl;  
  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.service;  
  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.service.impl;  
  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.service;  
  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.service.impl;  
  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.client;  
  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.           Facade f = new Facade();  
  182.           f.methodA();  
  183.           f.methodB();  
  184.           f.methodC() ;  
  185.     }  
  186.   
  187. }  

0 0
原创粉丝点击