简介

  1. 作用:
  2. 1)封装一组交互类,一致地对外提供接口
  3. 2)封装子系统,简化子系统调用
  4. JDK中体现:java.util.logging
  5. java.lang.Class
  6. javax.faces.webapp.FacesServlet

  7. 医院的例子
  8. 如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。
  9. 首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。
  10. 解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。
  11. 什么是门面模式
  12. 门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
  13. 就如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。

  14. 在什么情况下使用门面模式
  15. 为一个复杂子系统提供一个简单接口
  16. 提高子系统的独立性
  17. 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
  18.  

演示

  1. 对于一个复杂的系统,可能需要多个业务才能完成,如把大象关进冰箱里面
  2. public interface IServiceA {
  3.     void methodA();
  4. }
  5. public interface IServiceB {
  6.     void methodB();
  7. }
  8. public class ServiceAImpl implements IServiceA {
  9.     @Override
  10.     public void methodA() {
  11.         System.out.println("打开冰箱门");
  12.     }
  13. }
  14. public class ServiceBImpl implements IServiceB {
  15.     @Override
  16.     public void methodB() {
  17.         System.out.println("关闭冰箱门");
  18.     }
  19. }

  20. 这种情况下,使用者必须知道系统各个业务的具体功能及先后顺序才能使用
  21. public class Test {
  22.     public static void main(String[] args) {
  23.         IServiceA sa = new ServiceAImpl();
  24.         IServiceB sb = new ServiceBImpl();
  25.         sa.methodA();
  26.         sb.methodB();
  27.     }
  28. }


  29. 下面我们定义一个类,对子系统进行封装,以简化子系统调用
  30. /**
  31.  * 给一组组件,接口,抽象,或者子系统提供一个简单的访问接口
  32.  */
  33. public class Facade {
  34.     private IServiceA sa;
  35.     private IServiceB sb;
  36.     private IServiceC sc;
  37.     public Facade() {
  38.         sa = new ServiceAImpl();
  39.         sb = new ServiceBImpl();
  40.         sc = new ServiceCImpl();
  41.     }
  42.     /**
  43.      * 把大象装到冰箱里面
  44.      */
  45.     public void storeElephantidae() {
  46.         sa.methodA();
  47.         sb.methodB();
  48.     }
  49.     /**
  50.      * 把大象装到冰箱里面,并冷冻起来
  51.      */
  52.     public void storeElephantidae2() {
  53.         sa.methodA();
  54.         sb.methodB();
  55.         sc.methodC();
  56.     }
  57. }

  58. 这是一个很好的封装方法,如果一个子系统比较复杂的话,就可以封装出一个或多个门面出来,可以使项目的结构更简单,而且扩展性非常好。
  59. public class Test {
  60.     public static void main(String[] args) {
  61.         IServiceA sa = new ServiceAImpl();
  62.         IServiceB sb = new ServiceBImpl();
  63.         sa.methodA();
  64.         sb.methodB();
  65.         System.out.println("================");
  66.         Facade facade = new Facade();
  67.         facade.storeElephantidae();
  68.         System.out.println("================");
  69.         facade.storeElephantidae2();
  70.     }
  71. }
  72.  

附件列表

Facade 门面模式 外观模式的更多相关文章

  1. 设计模式 结构型模式 外观模式(Facade Pattern)

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...

  2. 结构型:代理模式 Vs 适配器模式 Vs 门面模式(外观模式)

    先上UML图 代理模式: 适配器模式: 门面模式(外观模式): 打了例子……呃……举个比方 代理模式: 水浒街,西门庆看上潘金莲,想和她嘿咻嘿咻,但是自己有不能去找潘金莲去说,于是他找到了金牌代理人王 ...

  3. php 23种设计模型 - 门面模式(外观模式)

    外观模式(Facade) 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系 ...

  4. java设计模式--结构型模式--外观模式

    外观模式 概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不 ...

  5. 【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade

    Python版 https://github.com/faif/python-patterns/blob/master/structural/facade.py #!/usr/bin/env pyth ...

  6. 外观模式 门面模式 Facade 结构型 设计模式(十三)

    外观模式(FACADE) 又称为门面模式   意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...

  7. 设计模式-外观模式(Facade)

    外观模式又称为门面模式,为一组类似功能的集群,比如类库.子系统等,提供一致的入口供client调用 角色和职责: 1.门面(Facade)-Computer: 外观模式的核心.它被客户角色调用,它熟悉 ...

  8. C#设计模式——外观模式(Facade Pattern)

    一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...

  9. 外观模式Facade pattern

    http://www.runoob.com/design-pattern/facade-pattern.html 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一 ...

随机推荐

  1. Python Lib:pyzmq

    http://git.oschina.net/gitlab/StartWithCoding/tree/master/example/python/pyzmq

  2. windows系统安装ubuntu后,grub中没有windows启动项

    我的问题: 安装系统时候,选择grub安装在sdb磁盘 http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=474289&start=15 ...

  3. 阻止文件不被上传到iCloud-b

    有空用下 http://www.cocoachina.com/bbs/read.php?tid=86244 http://www.ooso.net/archives/617 http://blog.c ...

  4. Adobe Photoshop CS或者CC卸载不了怎么办?

    有木有没有遇到这个问题的同学?使用Adobe Creative Suite CleanerToo工具下载就好了~ 下载地址:http://pan.baidu.com/s/1pJ3aBsn

  5. 转:SSE:服务器发送事件

    原文来自于:http://javascript.ruanyifeng.com/htmlapi/eventsource.html 目录 概述 客户端代码 概述 建立连接 open事件 message事件 ...

  6. Dollars

    uva147: 题意:给你几种钱币,在给你一个钱的数目,问有多少种用这些钱来组成这个数目. 题解:完全背包,不过此时要把钱的数目*100,因为是小数,背包的容量都是整数,然后dp,求出每个容量的数目即 ...

  7. HDU 5452 Minimum Cut

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5452题目大意: 给你一个图G,图中包含一颗生成树.要求只能删除生成树内的一条边,使得图不联通.问最小的删除 ...

  8. (转载)遍历memcache中已缓存的key

    (转载)http://www.cnblogs.com/ainiaa/archive/2011/03/11/1981108.html 最近需要做一个缓存管理的功能.其中有一个需要模糊匹配memcache ...

  9. SCU 4440 Rectangle 2015年四川省赛题

    题目链接:http://acm.scu.edu.cn/soj/problem/4440/ 题目大意:给一个n*m的方格,求周长小于等于k的矩形有多少个. 解题思路:我之前直接暴力,显然超时,所以后来发 ...

  10. SRM 407(1-250pt, 1-500pt)

    DIV1 250pt 题意:每个员工可以有几个直系上司,也可以有几个直系下属.没有直系下属的人工资为1,有直系下属的人工资为所有直系下属工资之和.求所有人工资之和.人数 <= 50. 解法:直接 ...