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. 有效解决js中添加border后动画bug问题

    做了个demo发现如果一个div不加border属性,用对象的offsetWidth属性来控制width没问题,但是如果一旦加了border属性,问题就来了. 其实offsetWidth属性获取的的是 ...

  2. 利用XPath解析带有xmlns的XML文件

    在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...

  3. 原生javascript操作class-元素查找-元素是否存在-添加class-移除class

    //判断元素是否有classfunction hasClass(ele, cls) { return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\ ...

  4. 谈memcache和memcached的区别

    用了段时间的memcache和memcached总结下认识,看很多人在用cache的时候,刚刚都没有搞清楚memcache 和 memcached的区别,还有就是使用的时候基本都是 get/set   ...

  5. Python Tutorial学习(十一)-- Brief Tour of the Standard Library – Part II

    11.1. Output Formatting 格式化输出 The repr module provides a version of repr() customized for abbreviate ...

  6. (转) 关于成为linux运维工程师需要掌握的技能

    曾经在一年多前写了一篇关于要成为linux运维需要掌握哪些技能和工具的贴子,然后不小心被好几个网友抄袭转发到其它网站上,当然有些是认识的,最后还很幸运地被某些热心的学习者把那段内容剪下来当作圣经般的参 ...

  7. 在HTML页面布局中,position的值有几种,默然的值是什么

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. 编译hadoop版的hello,world

    cd ~/src mkdir classes javac -classpath ~/hadoop-/hadoop--core.jar WordCount.java -d classes jar -cv ...

  9. 用C++实现绘制标尺的方法,使用了递归

    在这个例子当中将使用递归来实现一个打印标尺刻度的方法.首先是递归,函数调用其本身就叫递归,在需要将一项工作不断分为两项较小的.类似的工作时,递归非常有用,递归的方法被称为分而治之策略. 下面是一个wi ...

  10. ios7控件特性(一)

    苹果发布iOS7之后,iOS7全部采用扁平化的界面,我们的app界面在iOS7上出现了很大的改变,这包括UINavigationBar,UIButton,UIActionSheet,UITabBar等 ...