外观模式(门面模式)

外观模式介绍

定义

通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。 该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

好比我们去封装工具类。

优点

  • 简化客户端的调用
  • 代码复用,整合

应用场景

  • 需要使用复杂的子系统,但想避免重复且复杂的调用过程
  • 子系统需要组织成层结构时

经典案例

  • org.apache.catalina.connector.RequestFacade

外观模式结构与实现

其实外观模式就是在底层上封装一层接口,避免上层用户直接调用底层接口,提供一些简单的接口给用户使用!

结构

可以通过添加一个抽象外观角色来遵循开闭原则

外观(Facade)角色:为多个子系统对外提供一个共同的接口。
子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
客户(Client)角色:通过一个外观角色访问各个子系统的功能。

模板实现

本来我们需要实现一个功能需要依次执行三个系统类的三个方法,用户使用非常麻烦,因此可以封装一层 外观 类,它来负责与系统交互,用户只需要调用它提供的简单接口即可实现复杂的系统功能!!!


/*** 外观角色*/
class Facade {private SubSystem01 subSystem01 = new SubSystem01();private SubSystem02 subSystem02 = new SubSystem02();private SubSystem03 subSystem03 = new SubSystem03();public void method() {subSystem01.method1();subSystem02.method2();subSystem03.method3();}
}/*** 子系统角色1*/
class SubSystem01 {public void method1() {System.out.println("子系统01的method1()被调用!");}
}/*** 子系统角色2*/
class SubSystem02 {public void method2() {System.out.println("子系统02的method2()被调用!");}
}/*** 子系统角色3*/
class SubSystem03 {public void method3() {System.out.println("子系统03的method3()被调用!");}
}/*** 客户端角色*/
public class FacadeTemplateTest {public static void main(String[] args) {Facade f = new Facade();f.method();}
}/*子系统01的method1()被调用!子系统02的method2()被调用!子系统03的method3()被调用!
*/

示例 DVD播放电影

这个示例中我添加了 抽象外观角色,是为了遵循开闭原则,便于以后在不改变原有类的前提下扩展外观角色!

播放电影需要涉及到 DVD机、显示屏、音箱三个子系统,避免用户接触底层系统,创建外观角色提供简单的接口操作电影的开启、暂停与关闭

/*** 子系统3* 用于声音播放*/
class SoundBox {private boolean isRun;public void on() {if (!isRun) {System.out.println("开启音箱");}}public void off() {if (isRun) {System.out.println("关闭音箱");}}
}/*** 子系统2 屏幕* 用于画面显示*/
class Screen {private boolean isRun;public void on() {if (!isRun) {isRun = true;System.out.println("开启显示屏");}}public void off() {if (isRun) {isRun = false;System.out.println("关闭显示屏");}}
}/*** 子系统1 DVD* 用于读取光盘*/
class DVD {private boolean isOpen;private boolean hasCD;private boolean isScanning;public boolean isScanning() {return isScanning;}public void on() {if (!isOpen) {isOpen = true;System.out.println("打开DVD");}}public void put() {if (!hasCD) {hasCD = true;System.out.println("放入光碟");} else {System.out.println("已经有光盘了");}}public void take() {if (hasCD) {hasCD = false;System.out.println("取出光碟");} else {System.out.println("DVD中不存在光盘");}}public void scan() {if (!isScanning) {isScanning = true;System.out.println("DVD读取光盘");}}public void pause() {if (isScanning) {isScanning = false;System.out.println("DVD暂停读取光盘");}}public void off() {if (isOpen) {isOpen = false;System.out.println("关闭DVD");}}
}/*** 抽象门面:电影播放门面接口*/
interface MovieFacade {/*** 播放电影*/void playMovie();/*** 暂停电影播放*/void pauseMovie();/*** 关闭电影播放*/void closeMovie();
}/*** 具体门面:电影播放门面实现类*/
class MovieFacadeConcrete implements MovieFacade {private DVD dvd = new DVD();private SoundBox soundBox = new SoundBox();private Screen screen = new Screen();@Overridepublic void playMovie() {// 开启各个设备dvd.on();soundBox.on();screen.on();// 放入光碟dvd.put();// 读取光碟dvd.scan();}@Overridepublic void pauseMovie() {if (dvd.isScanning()) {dvd.pause();} else {dvd.scan();}}@Overridepublic void closeMovie() {// 暂停读取后再取出光盘if (dvd.isScanning()) {dvd.pause();}dvd.take();// 关闭各个设备screen.off();soundBox.off();dvd.off();}
}/*** 客户端*/
public class MovieClient {public static void main(String[] args) {MovieFacade movie = new MovieFacadeConcrete();movie.playMovie();// 开启设备并播放电影System.out.println("----------------");movie.pauseMovie();// 暂停播放System.out.println("----------------");movie.pauseMovie();// 继续播放System.out.println("----------------");movie.closeMovie();// 停止播放电影并关闭设备/** 打开DVD* 开启音箱* 开启显示屏* 放入光碟* DVD读取光盘* ----------------* DVD暂停读取光盘* ----------------* DVD读取光盘* ----------------* DVD暂停读取光盘* 取出光碟* 关闭显示屏* 关闭DVD*/}
}

设计模式-外观模式(门面模式)相关推荐

  1. 外观模式 门面模式 Facade 结构型 设计模式(十三)

    外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本 ...

  2. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  3. 门面设计模式php,学习php设计模式 php实现门面模式(Facade)

    这篇文章主要介绍了php设计模式中的门面模式,使用php实现门面模式,感兴趣的小伙伴们可以参考一下 一.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层次的接口,使得子系统 ...

  4. 混合模式(工厂方法模式+策略模式+门面模式)

    混合模式(工厂方法模式+策略模式+门面模式) 使用这三种模式设计一个简单的计算器程序:计算器是用于计算数值之间进行数学计算后所获得的值.它包含基本的"加减"功能.以上对以上需求进行 ...

  5. 设计模式——外观(门面)模式 ,即包装

    一.外观(门面)模式 定义: 为子系统的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用). 引例: 把病人和医院作为一个子系统,按照职 ...

  6. facade外观模式/门面模式(通过积分商城的例子理解外观模式)-设计模式

    目录 1.概述与图解 2.积分商城兑换礼品的例子 1.概述与图解 facade,外观模式,又叫门面模式.要解决的问题情境是,当一个客户端,需要调用多个子系统或者多个逻辑处理类,进而才能完成一个目标或功 ...

  7. Java设计模式-结构型-门面模式

    目录 前言 示例 前言 门面模式(也叫外观模式,Facade Pattern)在许多源码中有使用,比如 slf4j 就可以理解为是门面模式的应用.这是一个简单的设计模式,我们直接上代码再说吧. 示例 ...

  8. 【设计模式自习室】门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  9. 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)...

    一,总体概要 1,笔者浅谈 说起"门面"这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, 1 functio ...

最新文章

  1. URL解析-URLComponents
  2. 【实习项目记录】(一)加密算法MD5和RSA
  3. python隐藏windows磁盘
  4. MOSS2010 标准版与企业版的区别
  5. [leetcode] 3.无重复字符的最长子串
  6. 深度学习(十九)基于空间金字塔池化的卷积神经网络物体检测
  7. Java项目经验是程序员成长的重要经验
  8. 【华为云技术分享】Scrum Master如何引导团队中的刺头
  9. linux 查看 shell进程,Linux之shell 和进程
  10. 几何分布的期望和方差公式推导_数学期望、方差、协方差
  11. 如何格式化搭载 Apple 芯片的 Mac?
  12. linux 隐藏字符 h,webpack手动配置
  13. R语言中的read.table()
  14. 2022 基于SpringBoot/SSM的脚手架租赁系统
  15. ACM模板(Java)
  16. 卸载、Jlink驱动不成功,提示“could not open INSTALL.LOG file” 解决办法
  17. 微型计算机原理与接口技术第六版,微型计算机原理与接口技术(第6版)
  18. PF粒子滤波算法理解
  19. 三次样条插值的缺点_三次样条插值
  20. 关于启动 vue 项目出现 98% after emitting CopyPlugin 问题的出现

热门文章

  1. 在Excel VBA中写SQL,是一种什么体验
  2. 交互式课件制作步骤分享
  3. 杨焘鸣:说得多不如问得多
  4. 数据挖掘--(实验二)关联规则实验
  5. 细胞培养常见污染图鉴
  6. python透明的桌面时钟_python+PyQT实现系统桌面时钟
  7. Spring框架搭建实例
  8. 我也上去了!GodGuide!
  9. 新视野大学英语第三版第三册全书答案(完整版)
  10. win32实现类酷狗安装的进度条显示