门面模式

简介

作用:封装系统功能,简化系统调用

门面模式要求一个系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得系统更易于使用。

门面模式的门面类将客户端与系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与系统内部的很多对象打交道。

医院的例子
如果把医院作为一个系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个系统的客户端与一个系统的各个类打交道一样,不是一件容易的事情。
首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。
解决这种不便的方法便是引进门面模式。可以设置一个接待员的角色,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。

在什么情况下使用门面模式

  • 为一个复杂系统提供一个简单接口
  • 提高系统的独立性
  • 在层次化结构中,可以使用Facade模式定义系统中每一层的入口

案例

使用门面模式前

对于一个复杂的系统,可能需要多个业务才能完成,如把大象关进冰箱里面 ,需要的操作:

interface IServiceA {
void methodA();
}

interface IServiceB {
void methodB();
}

interface IServiceC {
void methodC();
}

  

实现类:

class ServiceAImpl implements IServiceA {
@Override
public void methodA() {
System.out.println("打开冰箱门");
}
}

class ServiceBImpl implements IServiceB {
@Override
public void methodB() {
System.out.println("把大象放到冰箱里");
}
}

class ServiceCImpl implements IServiceC {
@Override
public void methodC() {
System.out.println("关闭冰箱门");
}
}

  

这种情况下,使用者必须知道系统各个业务的具体功能及先后顺序才能使用

客户端使用示例:

public class Test {
public static void main(String[] args) {
IServiceA sa = new ServiceAImpl();
IServiceB sb = new ServiceBImpl();
IServiceC sc = new ServiceCImpl();

//在使用前,我必须先知道IServiceA、IServiceB、IServiceC是做什么的,并且知道调用顺序,之后我才能正确完成此功能
sa.methodA();
sb.methodB();
sc.methodC();
}
}

  

使用门面模式后

下面我们定义一个类,对子系统进行封装,以简化子系统调用

为系统提供一个简单的访问接口 :

interface IFacade {
void storeElephant(); //把大象装到冰箱里面
void freeElephant(); //放开那头大象
}

  

门面类将客户端与系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与系统内部的很多对象打交道。

class Facade implements IFacade {
private IServiceA sa;
private IServiceB sb;
private IServiceC sc;

public Facade() {
sa = new ServiceAImpl();
sb = new ServiceBImpl();
sc = new ServiceCImpl();
}

@Override
public void storeElephant() {
sa.methodA();
sb.methodB();
sc.methodC();
}

@Override
public void freeElephant() {
sa.methodA();
System.out.println("把大象从冰箱里拽出来");//这里为了省事,直接把这步操作放在了这里
sc.methodC();
}
}

  

这种情况下,使用者不需要知道系统各个业务的具体功能及先后顺序就能使用

客户端使用示例:

public class Test {
public static void main(String[] args) {
IFacade facade = new Facade();
facade.storeElephant();
System.out.println("=======================");
facade.freeElephant();
}
}

  

这是一个很好的封装方法,如果一个子系统比较复杂的话,就可以封装出一个或多个门面出来,可以使项目的结构更简单,而且扩展性非常好。

Facade 门面模式 封装 MD的更多相关文章

  1. 设计模式C++学习笔记之六(Facade门面模式)

      Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义 ...

  2. Facade 门面模式 外观模式

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

  3. 外观模式(Facade)(门面模式、子系统容易使用)

    外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低 ...

  4. Laravel中服务提供者和门面模式

    在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用. 这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖, ...

  5. Tomcat源代码-门面模式(Facade)

    从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...

  6. 说说设计模式~门面模式(Facade)

    返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...

  7. 开发设计模式(九)门面模式(Facade Pattern)

    什么是门面模式? 门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 大家都写过纸质的信件吧,比如给女朋友写 ...

  8. 24种设计模式--门面模式【Facade Pattern】

    大家都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的 ...

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

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

随机推荐

  1. 创建 python 虚拟环境

    conda 创建环境 conda 可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理.包管理与 pip 的使用类似,环境管理则允许用户方便地安装不同版本的 python 并可以快速切 ...

  2. JavaQuery操作对象

    1.jQuery操作的分类 <!DOCTYPE html>   <html>   <head lang="en">   <meta cha ...

  3. [python 源码]字符串对象的实现

    还是带着问题上路吧,和整数对象的实现同样的问题: >>> a='abc' >>> b='abc' >>> a is b True >> ...

  4. Swift2.0语言教程之下标脚本

    Swift2.0语言教程之下标脚本 下标脚本 下标脚本是访问对象.集合或者序列的快速方式.开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值.例如在数组中,可以直接使用下标去访问或者 ...

  5. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  6. softmax为什么使用指数函数?(最大熵模型的理解)

    解释1: 他的假设服从指数分布族 解释2: 最大熵模型,即softmax分类是最大熵模型的结果. 关于最大熵模型,网上很多介绍: 在已知部分知识的前提下,关于未知分布最合理的推断就是符合已知知识最不确 ...

  7. MySQL数据库sql语句

    零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PAS ...

  8. ShellExecuteA函数

    原型: ShellExecuteA(, , , );//最大化打开记事本 第一个参数//系统启动第二个参数//open打开第三个参数//指令第四个参数//默认0第五个参数//默认0第六个参数//0隐藏 ...

  9. Java-----jar反编译修改重新打包

    http://blog.csdn.net/hekewangzi/article/details/44676797 一.使用反编译工具JD-GUI(JD-GUI相关操作见Java-----反编译clas ...

  10. 【BZOJ-3123】森林 主席树 + 启发式合并

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2738  Solved: 806[Submit][Status] ...