【设计模式 - 10】之外观模式(Facade)
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)的更多相关文章
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式学习心得<外观模式 Facade>
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- IOS设计模式浅析之外观模式(Facade)
引言 在项目开发中,有时候会遇到这样的一种情景:已有系统的各个子系统之间,随着业务需求的发展,有了比较紧凑的耦合关系.现在需要利用这些子系统的功能,为移动端提供业务处理.我们该怎么应对这样的业务需求呢 ...
- 设计模式之八:外观模式(Facade)
外观模式: 为子系统中的一系列接口提供了一个统一的界面.外观模式定义了一个高层次的接口以使子系统更加easy使用. Provide a unified interface to a set of in ...
- 《JAVA设计模式》之外观模式(Facade)
在阎宏博士的<JAVA与模式>一书中开头是这样描述门面(Facade)模式的: 门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行.门面模式提供一个高层次的接口 ...
- 【转】设计模式(九)外观模式Facade(结构型)
设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 设计模式(九)外观模式Facade(结构型)
设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式(二)-- 外观模式(Facade)
设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
随机推荐
- 关于Java IM的一点资料
微信是腾讯采用自己开发的协议做的,其他市面上很多产品大都是采用XMPP协议,包括米聊在内之前也是这样子. 采用XMPP协议,服务端可以采用OpenFire搭建,客户端有个开源的叫asmack的东西,g ...
- Fedora 21 安装桌面环境
Mate桌面环境:$ sudo yum install @mate-desktop KDE桌面环境:$ sudo yum install @kde-desktop XFCE桌面环境:$ sudo yu ...
- 让QMainWindow也表现出QDialog的exec函数的特征
前几天在做毕业设计项目的时候,使用的PyQt4,想实现这么样一个功能: 场景描述:主窗口a(QMainWindow类型)和主窗口b(QMainWindow),b是通过a窗口中某一个按钮弹出来的. 功能 ...
- 添加标签2 jquery 和JS
TAG添加标签 做了个方法方便调用 一.JS版本 <!DOCTYPE html> <html lang="en"> <head> <met ...
- 桂电在线-php-提取菜单到配置文件
新建存储菜单的配置文件 menus.php,并配置菜单 <?php if ( ! defined('BASEPATH')) exit('No direct script access allow ...
- JavaScript学习心得(二)
一选择DOCTYPE DOCTYPE是一种标准通用标记语言的文档类型声明,目的是告诉标准通用标记语言解析器使用什么样的文档类型定义(DTD)来解析文档. 网页从DOCTYPE开始,即<!DOCT ...
- JS判断浏览器类型以及版本号
<script type="text/javascript"> (function(){ window.nav={}; ...
- 结合使用 Oracle Database 11g 和 Python
结合使用 Oracle Database 11g 和 Python 本教程介绍如何结合使用 Python 和 Oracle Database 11g. 所需时间 大约 1 个小时 概述 Python ...
- Maven工程的Web调试
1.添加Server,将Web工程和Tomcat关联起来: 1)Windows->Show views->Other-->Servers,将会在下方弹出Server的窗口,然后右键添 ...
- info.plist 属性讲解
1 常用项: Application requires iPhone environment:如果应用程序不能在ipodtouch上运行,设置此项为true; Application usesWi-F ...