[设计模式] 设计模式课程(十二)-- 门面模式(Facade)
2024-09-07 10:55:40
概述
- 也称外观模式
- 按目的属于结构型模式,按封装属于接口隔离模式
- 在组件构建过程中,某些接口之间的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口
- 软件是人和硬件间的间接,操作系统是软硬件间的间接,虚拟机是操作系统和软件间的间接
- 电脑外部接口(显示器、键盘、鼠标)是稳定的,内部结构(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
最新文章
- Centos7下配置node.js环境
- phpstorm 设置Utf8编码
- [课程设计]Scrum 1.6 多鱼点餐系统开发进度
- BZOJ2157: 旅游
- linux 添加新硬盘的方法
- rightTeam SCRUM第一个冲刺周期
- 百科编辑器ueditor应用笔记
- 知道Form.Show()和Form.ShowDialog()的区别吗
- ETL构建数据仓库五步法
- Linux配置支持高并发TCP连接(socket最大连接数)
- SQL学习之学会使用子查询
- 一个简单的带缓存http代理
- ECSHOP session
- 阿里云 Centos7.3安装mysql5.7.18 rpm安装
- UVA11636-Hello World!-水题
- 微信获取企业token流程
- springboot2.0 springcloud 断路器仪表盘支持
- Windows下Anaconda的安装和简单使用
- 【Spring学习笔记-MVC】Spring MVC之多文件上传 (zhan)
- 更改默认打开wifi功能
热门文章
- 运维干货|交换机不同VLAN之间及相同VLAN之内进行隔离
- thinkphp 5.1框架利用及rce分析
- 亲测有效,解决80端口被svchost.exe进程占用的问题,网上的方法不行,可以试试这个
- 经过努力+作弊,我终于完成了leetcode通过率最低的一道题
- 常见SQL命令总结学习 -- <;1>;
- vue 快速入门 系列 —— vue 的基础应用(上)
- .Net Core发布到Linux下验证码失效处理方案详解
- ON DUPLICATE KEY UPDATE作用
- 201871030103-陈荟茹 实验二 个人项目―《D{0-1}KP问题》项目报告
- PYTHON工业互联网应用实战12—客户端操作