门面模式

简介

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

门面模式要求一个系统的外部与其内部的通信必须通过一个统一的门面(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. MSTP多生成树的配置

    STP的不足 STP协议虽然能够解决环路问题,但是由于网络拓扑收敛较慢,影响了用户通信质量 而且如果网络中的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断 RSTP对STP的改 ...

  2. 机器学习之路:tensorflow 深度学习中 分类问题的损失函数 交叉熵

    经典的损失函数----交叉熵 1 交叉熵: 分类问题中使用比较广泛的一种损失函数, 它刻画两个概率分布之间的距离 给定两个概率分布p和q, 交叉熵为: H(p, q) = -∑ p(x) log q( ...

  3. 洛谷.4238.[模板]多项式求逆(NTT)

    题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...

  4. java的反射机制(第二篇)

    本文转载自:http://c.biancheng.net/cpp/html/1781.html 要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由“Class ...

  5. 保存全局Crash报告

    CrashHandler.java UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告 package  com.amanda;imp ...

  6. Spring Batch 批处理框架介绍

    前言 在大型的企业应用中,或多或少都会存在大量的任务需要处理,如邮件批量通知所有将要过期的会员,日终更新订单信息等.而在批量处理任务的过程中,又需要注意很多细节,如任务异常.性能瓶颈等等.那么,使用一 ...

  7. mysql另类分页方法

    mysql> limit ,;select found_rows(); +----+-----------------+---------+--------+ | id | rankName | ...

  8. SQL(insert、delete、update)执行成功,但是数据库表中无显示无记录

    如题,程序中insert一条记录,调试过程中根据执行结果发现此条sql已经执行成功(影响行数为1且插入记录已生成自增主键正确值),但是查询数据库相应表时发现表中并无相应记录,通过直接在表中插入测试数据 ...

  9. js跨域请求提示函数未定义的问题

    我的代码是这么写的 window.onload=function(){ function sendRequest(){ var script=document.getElementById(" ...

  10. [Android] 字体使用dp单位避免设置系统字体大小对排版的影响

    [Android] 字体使用dp单位避免设置系统字体大小对排版的影响 以魄族mx3为例,在设置->显示->字体大小中能够选择字号大小例如以下图: 图1. 魄族mx3 会导致软件在有固定定高 ...