【设计模式 - 10】之外观模式(Facade)

时间:2021-09-04 00:43:20

1、模式简介

  外观模式隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。外观模式往往涉及到一个类,这个类提供了客户端请求的简化方法和对现有系统类方法的委托调用。外观模式使得系统中的子系统更加容易使用。

  外观模式主要是为了降低访问复杂系统的内部子系统的复杂度,简化客户端与之的接口。

  外观模式的核心是在客户端和复杂系统之间添加一层外观层,外观层将子模块的调用顺序、依赖关系等都封装好。

外观模式的适用场景:

  • 当需要定义系统的入口时;
  • 当客户端不需要知道系统内部的复杂联系,需要为整个系统提供一个“接待员”时;
  • 当需要预防低水平人带来的风险时。

外观模式的优点:

  • 减少了系统中的相互依赖;
  • 提高了系统的安全性。

外观模式的缺点:

  如果子模块中有新功能加入,则需要修改很多东西,不符合开闭原则。

2、案例

2.1、需求

  病人去医院看病的时候,需要经过挂号、收费、门诊、取药等多个步骤,如下图所示。这样对于病人和病人家属来说都太复杂。

【设计模式 - 10】之外观模式(Facade)

  如果我们在医院和病人之间设立一个“接待员”,用来代替病人来完成这一系列的事情,病人就会简单很多。添加接待员之后的医院子系统如下图所示:

【设计模式 - 10】之外观模式(Facade)

2.2、代码

  程序目录结构如下图所示:

【设计模式 - 10】之外观模式(Facade)

  hospital相当于是一个子模块,其中的Registration、Payment、Outpatient和TakeMedicine都是业务流程类,其中分别有一个方法代表做这项业务的方法。

  Receptionist类是一个接待员类,这个类中封装了上面四个类。具体来看Receptionist类中的代码:

/**
* 接待员类
*/
public class Receptionist {
/**
* 接待病人
*/
public void doRecept() {
// 帮病人挂号
Registration registration = new Registration();
registration.doRegister();
// 帮病人交钱
Payment payment = new Payment();
payment.doPay();
// 病人就诊
Outpatient outpatient = new Outpatient();
outpatient.doOutpatient();
// 帮病人取药
TakeMedicine takeMedicine = new TakeMedicine();
takeMedicine.doTakeMedicine();
}
}

  测试代码如下:

public class Test {
public static void main(String[] args) {
Receptionist receptionist = new Receptionist();
receptionist.doRecept();
}
}

  测试结果如下图所示:

【设计模式 - 10】之外观模式(Facade)

  最后贴出外观模式的GitHub代码地址:【GitHub - Facade】

【设计模式 - 10】之外观模式(Facade)的更多相关文章

  1. 设计模式系列之外观模式(Facade Pattern)——提供统一的入口

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 设计模式学习心得&lt&semi;外观模式 Facade&gt&semi;

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

  3. IOS设计模式浅析之外观模式&lpar;Facade&rpar;

    引言 在项目开发中,有时候会遇到这样的一种情景:已有系统的各个子系统之间,随着业务需求的发展,有了比较紧凑的耦合关系.现在需要利用这些子系统的功能,为移动端提供业务处理.我们该怎么应对这样的业务需求呢 ...

  4. 设计模式之八:外观模式&lpar;Facade&rpar;

    外观模式: 为子系统中的一系列接口提供了一个统一的界面.外观模式定义了一个高层次的接口以使子系统更加easy使用. Provide a unified interface to a set of in ...

  5. 《JAVA设计模式》之外观模式&lpar;Facade&rpar;

    在阎宏博士的<JAVA与模式>一书中开头是这样描述门面(Facade)模式的: 门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行.门面模式提供一个高层次的接口 ...

  6. 【转】设计模式(九)外观模式Facade(结构型)

    设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  7. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  8. 乐在其中设计模式&lpar;C&num;&rpar; - 外观模式&lpar;Facade Pattern&rpar;

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  9. 设计模式(二)-- 外观模式&lpar;Facade&rpar;

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  10. 8&period;4 GOF设计模式三&colon; 外观模式 Facade

    GOF设计模式三: 外观模式 Facade  “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...

随机推荐

  1. C&num;Json序列化和反序列化

    1.动态决定数据是否要序列化 我的需求是这样的,我用了一款数据库的组件叫Dos.ORM,确实方便了不少,但是在用的时候,我发现一个问题,比如我定义的表中有一个字段添加时间,修改时间,这些都是默认的,在 ...

  2. JAVA解析各种编码密钥对(DER、PEM、openssh公钥)

    一.DER编码密钥对 先说下DER编码,是因为JCE本身是支持DER编码密钥对的解析的,可以参见PKCS8EncodedKeySpec和X509EncodedKeySpec. DER编码是ASN.1编 ...

  3. 转-android 支付宝SDK集成

    http://blog.csdn.net/kroclin/article/details/40746779 一.前言 最近做的项目刚好要集成支付宝,上网找了很多资料,介绍得感觉不是很全面,所以我经过这 ...

  4. 深入理解C&num;中this&sol;partial&sol;null的使用

    一.this关键字作用 1.this表示当前运行中的对象 Eg: public class Person { public int age; public string name; public Pe ...

  5. Delphi结构中使用String时遇到的内存泄露问题(没有利用String的引用计数自动销毁字符串的功能)

    先定义一个结构: TUserInfo = record  UserID: Integer; // 用户编号  UserName: string; // 用户名end; 然后编写如下代码: proced ...

  6. 如何获得android手机通讯录的字母显示&lpar;两)

    随后的写如何使各第一字母显示相同的分类触点: 于adapter implement SectionIndexer 这项adapter必须在下面可以实现3接口: @Override public Obj ...

  7. Java虚拟机内存分配详解

    简介 了解Java虚拟机内存分布的好处 1.了解Java内存管理的细节,有助于程序员编写出性能更好的程序.比如,在新的线程创建时,JVM会为每个线程创建一个专属的栈 (stack),其栈是先进后出的数 ...

  8. &lbrack;Error&rsqb; 未发现相关 less 编译器配置&comma;请检查wepy&period;config&period;js文件

    此错误是由于缺少包引起的 npm install less -d 直接装包即可

  9. 解决At least one JAR was scanned for TLDs yet contained no TLDs&period; Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them&period; Skipping unneeded JARs

    在写spring security小程序时遇到  At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug l ...

  10. swift 关于didSet 和willSet赋值的注意点

    1. 初始化赋值的时候都不会走这个的方法, 需要在创建结构体后或对象后,在赋值,此时才会走这个方法