概述

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

场景

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

结构

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

示例1

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

    在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...

  2. [Fundamental of Power Electronics]-PART I-4.开关实现-4.3 开关损耗/4.4 小结

    4.3 开关损耗/4.4 小结 使用半导体器件实现开关后,我们现在可以讨论变换器中损耗和低效的另一个主要来源:开关损耗.如前所述,半导体器件的导通和关断转换需要几十纳秒到几微秒的时间.在这些开关转换期 ...

  3. 2020.1 PyCharm 激活

    1 下载安装 平台windows,官网: 选路径后, 选项分别是64位的快捷方式,添加运行目录到环境变量PATH,添加右键菜单"打开文件夹作为一个工程",python文件关联,按需 ...

  4. 【秒懂音视频开发】18_详解YUV

    本文的主角是多媒体领域非常重要的一个概念:YUV. 简介 YUV,是一种颜色编码方法,跟RGB是同一个级别的概念,广泛应用于多媒体领域中. 也就是说,图像中每1个像素的颜色信息,除了可以用RGB的方式 ...

  5. 带你温习一下webpack配置

    前言 你知道node.webpack和npm之间的关系吗? 首先来介绍一下node.webpack和npm的有什么样的关系. 我们知道webpack是对我们所开发的html.css.js等模块化开发的 ...

  6. OO第二单元总结——电梯

    在电梯系列的作业中,笔者的整体架构几乎没有发生改变.现介绍如下,对于一个电梯系统,主要的工作步骤就是获取乘客请求.分派请求.执行请求.针对这样的工作模式,笔者设计了Elevator.Uselist两个 ...

  7. maven自动化构建工具

    目录结构: 一.Maven简介 二.Maven核心概念 三.Maven的使用 四.Maven在IDEA中的应用 五.依赖管理 六.Maven常用设置 ------------------------- ...

  8. 1017. Convert to Base -2

    Given a number N, return a string consisting of "0"s and "1"s that represents it ...

  9. hdu 1867 求两个串的"和"最小 ,KMP

    题意:       给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...

  10. hdu3313 最大流找关键点,或者最短路找关键点.

    题意:      给你一个有向图,然后给你起点和终点,问你从起点到终点有多少个关键点,如果当前的这个点删除了就无法从起点到终点,那么这个点就是一个关键点.. 思路:      (1)有两种做法,我用的 ...