概述

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

    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) 凌宸1642 题目描述: At the beginning of ever ...

  2. CVPR2021| 继SE,CBAM后的一种新的注意力机制Coordinate Attention

    前言: 最近几年,注意力机制用来提升模型性能有比较好的表现,大家都用得很舒服.本文将介绍一种新提出的坐标注意力机制,这种机制解决了SE,CBAM上存在的一些问题,产生了更好的效果,而使用与SE,CBA ...

  3. [GDKOI2021] 普及组 Day3 总结 && 题解

    [ G D K O I 2021 ] 普 及 组 D a y 3 总 结 时间安排和昨天的GDKOI2021 Day2一样. 早上四个小时的快乐码题时间,然鹅我打了半小时的表 然后就是下午的题目讲解和 ...

  4. [树形DP]没有上司的晚会

    没 有 上 司 的 晚 会 没有上司的晚会 没有上司的晚会 题目描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职 ...

  5. 结对编程_stage1

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目-第一阶段 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法. ...

  6. 软工热身——回顾&展望

    项目 内容 这个作业属于哪个课程 2021春季软件工程 (罗杰 任健) 这个作业的要求在哪里 第一次阅读作业 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法.软 ...

  7. Day13_64_线程的优先级

    线程的调度 * 单核CPU在某一时刻只能执行一条指令,线程只有得到CPU的时间片,也就是使用权,才可以执行指令 * 在单核CPU的机器上线程不是并行运行的,而是频繁切换运行的,只有在多个CPU上线程才 ...

  8. DVWA之File Inclusion

    File Inclusion File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),req ...

  9. Python中的Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  10. poj2175费用流消圈算法

    题意:      有n个建筑,每个建筑有ai个人,有m个避难所,每个避难所的容量是bi,ai到bi的费用是|x1-x2|+|y1-y2|+1,然后给你一个n*m的矩阵,表示当前方案,问当前避难方案是否 ...