概述

  • 也称外观模式
  • 按目的属于结构型模式,按封装属于接口隔离模式
  • 在组件构建过程中,某些接口之间的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口
  • 软件是人和硬件间的间接,操作系统是软硬件间的间接,虚拟机是操作系统和软件间的间接
  • 电脑外部接口(显示器、键盘、鼠标)是稳定的,内部结构(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. Elasticsearch扩展X-pack实施流程-实施

    Elasticsearch扩展X-PACK实施流程 elasticsearch5.2.1安装X-PACK,对ES集群进行监控,报警,安全验证,报告,图形化操作 注意 版本号需要固定,小版本都不能差,要 ...

  2. H5 离线存储-使用 serverWorker 实现

    H5 离线存储-使用 serverWorker 实现 离线存储所用技术 serverWorker serviceWorker 生命周期 install 事件会在 serviceWorker 注册成功时 ...

  3. 【CTF】2019湖湘杯 miscmisc writeup

    题目来源:2019湖湘杯 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1&id= ...

  4. Gson?So easy.

    1.概述 这篇文章主要讲述了Gson的使用.包括从最基础的基本类型的序列化,到对象,数组,集合,再到Gson注解,Gson Builder,再到格式化,自定义序列化与反序列化等内容. 另外文章篇幅较长 ...

  5. IDEA 配置文件位置

    1 IDEA 2020.1 以上 1.1 Win 语法: %APPDATA%\JetBrains\<product><version> Win上的APPDATA默认位置如下: ...

  6. unzip解压中文乱码

    1 问题描述 直接 unzip xxx.zip 乱码,肯定是编码问题了不用问.但是unzip没有指定编码的选项: 网上的解决方案如下: unzip -O GBK/GB18030CP936 xx.zip ...

  7. redhat7.6 安装 Python 3

    redhat7.6 默认安装了python2.7. 查看已安装python情况 cd / # 定位到根目录 whereis python # 查看python所在目录 /usr/bin cd /usr ...

  8. K8s - 解决主机重启后kubelet无法自动启动问题 错误:The connection to the server 192.168.60.128:6443 was refused - did you specify the right host or port?

    1,问题描述 (1)在安装配置好 Kubernetes 后,正常情况下服务器关机重启,kubelet 也会自动启动的.但最近配置的一台服务器重启后,输入命令 kubectl get nodes 查看节 ...

  9. N 皇后-力扣解题

    n 皇后问题 研究的是如何将 n 个皇后放置在 n*n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案. 每一种解法包含一个不同的 n 皇后问 ...

  10. 【全网首发】鸿蒙开源三方组件--强大的弹窗库XPopup组件

    目录: 1.介绍 2.效果一览 3.依赖 4.如何使用 5.下载链接 6.<鸿蒙开源三方组件>文章合集 1. 介绍 ​ XPopup是一个弹窗库,可能是Harmony平台最好的弹窗库.它从 ...