概述

  • 也称外观模式
  • 按目的属于结构型模式,按封装属于接口隔离模式
  • 在组件构建过程中,某些接口之间的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口
  • 软件是人和硬件间的间接,操作系统是软硬件间的间接,虚拟机是操作系统和软件间的间接
  • 电脑外部接口(显示器、键盘、鼠标)是稳定的,内部结构(CPU、内存、硬盘)是变化的
  • 依赖倒置原则
  • 降低系统间耦合的复杂度
  • A方案的问题在于组件的客户和组件中的各种复杂子系统有了过多的耦合,B方案外部用户只通过Facade与系统连接,从而不受系统内部变化的影响
  • 为子系统中的一组接口提供一个一致(稳定)的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用(复用)
  • 用稳定接口隔离变化部分
  • 注重从架构层次看整个系统,而不是单个类的层次,更多时候是一种架构设计模式
  • Facade模式并非是一个集装箱,可以任意放进任何多对象,应该是“相互耦合关系比较大的一系列组件”,而非一个简单功能的集合(对外松耦合,对内高内聚)

场景

  • 电话购物时,接线员是商场所有服务和部门的外观,为顾客提供了一个同购物系统、支付网关和各种送货服务进行互动的语音接口
  • 简化客户端与复杂视频转换框架之间的交互

结构

  • 外观类:提供访问特定子系统的快捷方式,了解如何重定向客户端请求,如何操作一切活动部件
  • 附加外观类:避免多种不相关的功能污染单一外观,使其变成又一个复杂接口
  • 复杂子系统:由数十个不同对象构成,子系统不会意识到外观的存在,它们在系统内运作并相互之间可以直接进行交互
  • 客户端:使用外观代替对子系统的直接调用

示例1

 1 // 这里有复杂第三方视频转换框架中的一些类。我们不知晓其中的代码,因此无法
2 // 对其进行简化。
3
4 class VideoFile
5 // ...
6
7 class OggCompressionCodec
8 // ...
9
10 class MPEG4CompressionCodec
11 // ...
12
13 class CodecFactory
14 // ...
15
16 class BitrateReader
17 // ...
18
19 class AudioMixer
20 // ...
21
22
23 // 为了将框架的复杂性隐藏在一个简单接口背后,我们创建了一个外观类。它是在
24 // 功能性和简洁性之间做出的权衡。
25 class VideoConverter is
26 method convert(filename, format):File is
27 file = new VideoFile(filename)
28 sourceCodec = new CodecFactory.extract(file)
29 if (format == "mp4")
30 destinationCodec = new MPEG4CompressionCodec()
31 else
32 destinationCodec = new OggCompressionCodec()
33 buffer = BitrateReader.read(filename, sourceCodec)
34 result = BitrateReader.convert(buffer, destinationCodec)
35 result = (new AudioMixer()).fix(result)
36 return new File(result)
37
38 // 应用程序的类并不依赖于复杂框架中成千上万的类。同样,如果你决定更换框架,
39 // 那只需重写外观类即可。
40 class Application is
41 method main() is
42 convertor = new VideoConverter()
43 mp4 = convertor.convert("funny-cats-video.ogg", "mp4")
44 mp4.save()

参考

https://refactoringguru.cn/design-patterns/facade

[设计模式] 设计模式课程(十二)-- 门面模式(Facade)的更多相关文章

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

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

  2. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  3. 说说设计模式~门面模式(Facade)

    返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...

  4. Java 设计模式系列(十)外观模式

    Java 设计模式系列(十)外观模式 门面模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这 ...

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

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

  6. 设计模式在实际业务应用中的介绍之3——外观或门面模式Facade对AOP装配业务工厂的应用

    在C#中实现的基于外观或门面模式打造的业务应用案例 以前一直没有想过写一些东西来把项目中用到的知识点及技术实现做一个归纳整理并分享出来.现在打算逐渐的把项目中的一些东西整理并分享出来,与大家共勉! 外 ...

  7. Android设计模式源码解析之外观模式(Facade)

    https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/facade/elsd ...

  8. Java设计模式之(九)——门面模式

    1.什么是门面模式? Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher ...

  9. Tomcat源代码-门面模式(Facade)

    从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...

  10. c++ 门面模式(Facade)

    门面模式是比较常用的一种设计模式,我们可能在无意中就会使用,门面模式就是用一个门面类来处理子系统的复杂关系,门面类简单的Api接口供客户端调用.用一个简单的演播室来表示. #include <i ...

随机推荐

  1. 分享一次排查CLOSE_WAIT过多的经验

    关键词:TCP.CLOSE_WAIT 问题背景 某日下午有测试人员急匆匆的跑来跟我反馈:"有客户反馈供应商附件预览不了,流程阻塞,需要紧急处理",我立马精神起来,毕竟都是付费客户( ...

  2. JS复制文本到粘贴板,前端H5移动端点击按钮复制文本

    <span id="codeNum">FTYHDSDW</span> <span class=" code-btn" id=&qu ...

  3. 从HotSpot VM源码看字符串常量池(StringTable)和intern()方法

    引言 字符串常量池(StringTable)是JVM中一个重要的结构,它有助于避免重复创建相同内容的String对象.那么StringTable是怎么实现的?"把字符串加入到字符串常量池中& ...

  4. Leedcode算法专题训练(排序)

    排序 快速排序 用于求解 Kth Element 问题,也就是第 K 个元素的问题. 可以使用快速排序的 partition() 进行实现.需要先打乱数组,否则最坏情况下时间复杂度为 O(N2). 堆 ...

  5. Github Pages+Gridea搭建个人博客

    1 概述 Github Pages可以用来托管个人网站,静态的,便于用来实现博客,可以在一个仓库的settings中开启: Gridea是一个静态博客写作客户端,所有文件都在本地,没有数据库,实现简单 ...

  6. 破解class文件的第一步:深入理解JAVA Class文件

    摘要: java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用java class文件来表示的,java class文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的. j ...

  7. Mybatis3源码笔记(七)Plugin

    1.Mybatis3的插件其实主要是用到了责任链和动态代理两种模式相结合而生成的.下面我们看一个例子,在执行所有update操作时,执行一个小小的测试输出. @Intercepts({@Signatu ...

  8. Day01_01_java背景

    1.Java背景 --由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称. --Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当 ...

  9. 码农飞升记-00-Java发展历程

    目录 1.Java发布历程 2.Java发展史 Oak 的出现( Java 的雏形) 1995年 Java 的诞生 1996年 Sun 公司发布第一个 JDK 1998年12月用 J2SE 取代 JD ...

  10. 从苏宁电器到卡巴斯基第26篇:难忘的三年硕士时光 IV

    录课,录课,还是录课 开题结束以后,已经是三月的下旬,当时我在考虑要不要回家,毕竟学校这里也没什么事了,我待在学校还得付出一定的花销.后来我考虑到在家的话,只有晚上才能够录课,而在学校的话,整个白天都 ...