[设计模式] 设计模式课程(十二)-- 门面模式(Facade)
概述
- 也称外观模式
- 按目的属于结构型模式,按封装属于接口隔离模式
- 在组件构建过程中,某些接口之间的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口
- 软件是人和硬件间的间接,操作系统是软硬件间的间接,虚拟机是操作系统和软件间的间接
- 电脑外部接口(显示器、键盘、鼠标)是稳定的,内部结构(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)的更多相关文章
- 外观模式 门面模式 Facade 结构型 设计模式(十三)
外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...
- Java 设计模式系列(十二)策略模式(Strategy)
Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...
- 说说设计模式~门面模式(Facade)
返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...
- Java 设计模式系列(十)外观模式
Java 设计模式系列(十)外观模式 门面模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这 ...
- 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)
一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...
- 设计模式在实际业务应用中的介绍之3——外观或门面模式Facade对AOP装配业务工厂的应用
在C#中实现的基于外观或门面模式打造的业务应用案例 以前一直没有想过写一些东西来把项目中用到的知识点及技术实现做一个归纳整理并分享出来.现在打算逐渐的把项目中的一些东西整理并分享出来,与大家共勉! 外 ...
- Android设计模式源码解析之外观模式(Facade)
https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/facade/elsd ...
- Java设计模式之(九)——门面模式
1.什么是门面模式? Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher ...
- Tomcat源代码-门面模式(Facade)
从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...
- c++ 门面模式(Facade)
门面模式是比较常用的一种设计模式,我们可能在无意中就会使用,门面模式就是用一个门面类来处理子系统的复杂关系,门面类简单的Api接口供客户端调用.用一个简单的演播室来表示. #include <i ...
随机推荐
- 尝试做一个.NET简单、高效、避免OOM的Excel工具
Github : https://github.com/shps951023/MiniExcel 简介 我尝试做一个.NET简单.高效.避免OOM的Excel工具 目前主流框架大多将资料全载入到记忆体 ...
- Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd
前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...
- 字体图标库 iconfont、iconmoon 的维护管理与使用探索
字体图标库的使用 这是之前留下的博客,由于一堆博客没写完,本周周末做了个补充,可能内容上会有点不太斜街,请见谅... 本文大部分内容是自己结合过往经验探索总结的字体图标维护方式 iconfont-阿里 ...
- vm16 安装 || 待检验 || 预测无问题
vm16 安装 安装 下载 下载地址 管理员运行 安装 其余都点下一步/NEXT 激活 完成
- CppCon 2019 | Back to Basics: RAII and The Rule of Zero
本文整理了Arthur O'Dwyer在CppCon 2019上关于RAII的演讲,演讲的slides可以在此链接进行下载. 在C++程序中,我们往往需要管理各种各样的资源.资源通常包括以下几种: A ...
- linux too many open files 问题总结
问题描述: kubernetes 集群使用promtail收集日志,发现一段时间有些机器日志收集不到查看promtail日志出现以下报错: error="filetarget.fsnotif ...
- Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...
- AdaBoostClassifier参数
[AdaBoostClassifier] Adaboost-参数: base_estimator:基分类器,默认是决策树,在该分类器基础上进行boosting,理论上可以是任意一个分类器,但是如果是其 ...
- hdu4849 最短路
题意: 让你求0到所有点最短路中对m取余最小的那个数. 思路: 简单题,直接根据题目给的公式把z求出来,然后建边,然后最短路,然后枚举每一个点对m取余记录最小,然后输出答案,然 ...
- XML和JSON数据格式
目录 XML DTD(文档类型定义) DTD实体 JSON 使用python解析JSON数据 XML和JSON的区别 XML的优缺点 JSON的优缺点 XML和JSON都是web存储和传输过程中数据的 ...