1、模式简介

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

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

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

外观模式的适用场景:

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

外观模式的优点:

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

外观模式的缺点:

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

2、案例

2.1、需求

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

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

2.2、代码

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

  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();
}
}

  测试结果如下图所示:

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

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

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

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

  2. 设计模式学习心得<外观模式 Facade>

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

  3. IOS设计模式浅析之外观模式(Facade)

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

  4. 设计模式之八:外观模式(Facade)

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

  5. 《JAVA设计模式》之外观模式(Facade)

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

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

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

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

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

  8. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

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

  9. 设计模式(二)-- 外观模式(Facade)

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

  10. 8.4 GOF设计模式三: 外观模式 Facade

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

随机推荐

  1. [lua]尝试一种Case语法糖

    function CaseT(arg) function proxy(caller) caller.yield(r) end -- proxy return function (cond) if (c ...

  2. [学习笔记]设计模式之Facade

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Facade(外观)模式定义了一个高层接口,它能为子系统中的一组接口提供一个一致的界面,从而使得这一子系统更加容易使用.欢迎回到时の魔 ...

  3. cell的循环使用

    cell的循环利用:(对cell的简单优化) 1.创建一个标示(Identifier),用于区分缓存池里的不同cell. 2.去缓存池里拿自己对应的cell,用到dequeueReusableCell ...

  4. 【JAVA集合】HashMap源码分析(转载)

    原文出处:http://www.cnblogs.com/chenpi/p/5280304.html 以下内容基于jdk1.7.0_79源码: 什么是HashMap 基于哈希表的一个Map接口实现,存储 ...

  5. 桂电在线-php-提取菜单到配置文件2

    继续昨晚没完成的主菜单模板: <!-- 菜单块 --> <div class="on-light" id="menus"> <?p ...

  6. Python 学习笔记(2) - 基本概念、运算符与表达式

    字符串 - 可以使用 3 种形式 - 单引号 :「'your string'」 - 双引号 :「"your string"」 - 三引号 :「'''your string''' 或 ...

  7. C# 数据结构 栈 Stack

    栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...

  8. Welcome to JimmyCheung's blog!

    博客开通,写写学习笔记,写写心情,写写生活中的点点滴滴~ 有钱的捧个钱场嘞,没钱的贡献个点击量,新鲜的博客出炉咯,来五毛钱的博文呗~ By Jimmy 2014.09.16

  9. MFC窗口分割以及各窗口间的通讯

    一个偶然的机会又重新接触了MFC窗口的分割,自己结合资料重新写了一个窗口分割的程序,现将具体流程跟大家分享一下: 1.我们先创建一个MFC单文档类的程序,具体分割方式先将单文档整个客户区分成两行一列, ...

  10. zookeeper kazoo Basic Usage

    http://kazoo.readthedocs.org/en/latest/basic_usage.html Basic Usage Connection Handling To begin usi ...