简介

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

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

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

演示

对于一个复杂的系统,可能需要多个业务才能完成,如把大象关进冰箱里面
public interface IServiceA {
    void methodA();
}
public interface IServiceB {
    void methodB();
}
public class ServiceAImpl implements IServiceA {
    @Override
    public void methodA() {
        System.out.println("打开冰箱门");
    }
}
public class ServiceBImpl implements IServiceB {
    @Override
    public void methodB() {
        System.out.println("关闭冰箱门");
    }
}

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


下面我们定义一个类,对子系统进行封装,以简化子系统调用
/**
 * 给一组组件,接口,抽象,或者子系统提供一个简单的访问接口
 */
public class Facade {
    private IServiceA sa;
    private IServiceB sb;
    private IServiceC sc;
    public Facade() {
        sa = new ServiceAImpl();
        sb = new ServiceBImpl();
        sc = new ServiceCImpl();
    }
    /**
     * 把大象装到冰箱里面
     */
    public void storeElephantidae() {
        sa.methodA();
        sb.methodB();
    }
    /**
     * 把大象装到冰箱里面,并冷冻起来
     */
    public void storeElephantidae2() {
        sa.methodA();
        sb.methodB();
        sc.methodC();
    }
}

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

附件列表

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. 学习opencv 第六章 习题十三

    用傅里叶变换加速卷积,直接上代码,Mat版是Copy他人的. CvMat版 #include "stdafx.h" #include "cv.h" #inclu ...

  2. Android:创建可穿戴应用 - 自定义布局

    创建自定义布局(Creating Custom Layouts) 本文将介绍如何创建自定义通知以及使用可穿戴UI库来创建自定义布局你同时还需要了解可穿戴设计准则(Wear Design Princip ...

  3. 【HDOJ】2425 Hiking Trip

    优先级队列+BFS. #include <iostream> #include <cstdio> #include <cstring> #include <q ...

  4. 用c写99乘法表

    int main(int argc,char **argv){ int a; for(a=1;a<=9;a++){ int b; for(b=1;b<=a;b++){ printf(&qu ...

  5. Unity NGUI实现技能CD效果

    unity版本:4.5.1 NGUI版本:3.6.5 脚本代码:C# 在游戏中经常要实现技能的CD效果,NGUI中已经实现了这个功能,即在button上创建一个半透明的Sprite实现这个功能. 首先 ...

  6. 「Poetize3」绿豆蛙的归宿

    描述 Description 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点.绿豆蛙从起点出发,走向终点.到达每一个顶点时,如果有K ...

  7. 【贪心】HDU 5783 Divide the Sequence

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5783 题目大意: 把一个N个数的数列拆成若干段,保证每一段的前缀和都非负,求最多能拆成多少段. 题目 ...

  8. datetime和timer的使用(小小幻灯片)

    一:展示图片 每秒换一次图片,一共六十张图片,00-59 二:代码 a,设计代码 namespace timePicture { partial class Form1 { /// <summa ...

  9. 高效算法——Most financial institutions 贪心 H

    H - 贪心 Crawling in process... Crawling failed Time Limit:3000MS     Memory Limit:0KB     64bit IO Fo ...

  10. 如何更改项目所使用的C#版本