外观模式:简化复杂子系统的访问与使用
文章目录
- 1. 简介
- 2. 外观模式的基本结构
- 3. 外观模式的实现步骤
- 4. 外观模式的应用与实例
- 4.1 图形界面库的外观模式应用
- 4.2 文件压缩与解压缩的外观模式应用
- 4.3 订单处理系统的外观模式应用
- 5. 外观模式的优缺点
- 5.1 优点
- 5.2 缺点
- 6. 总结
1. 简介
外观模式是一种结构型设计模式,它提供了一个统一的接口,用于简化复杂子系统的访问和使用。通过外观模式,可以隐藏子系统的复杂性,并将其封装在一个高层接口之后,使得客户端可以通过调用这个外观接口来间接地访问子系统的功能。外观模式有助于降低系统的耦合度,提高系统的灵活性和可维护性。
2. 外观模式的基本结构
外观模式由以下几个核心角色组成:
- 客户端角色(Client):通过外观接口与子系统进行交互。
- 外观角色(Facade):封装了子系统的复杂性,提供简单的高层接口给客户端使用。
- 子系统角色(Subsystem):负责具体的功能实现。

3. 外观模式的实现步骤
通过以下步骤可以实现外观模式:
- 定义子系统的各个组件及其功能,确保每个组件都能够独立工作。
- 创建外观类,将子系统的功能封装在外观类中。
- 在外观类中实现对子系统的统一访问接口,这个接口应该简单明了。
- 客户端通过外观类来访问子系统,无需直接与子系统的组件进行交互。
代码示例:
// 子系统组件A
class SubsystemA {public void operationA() {// 实现具体的功能逻辑}
}// 子系统组件B
class SubsystemB {public void operationB() {// 实现具体的功能逻辑}
}// 外观类
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();}public void operation() {subsystemA.operationA();subsystemB.operationB();// 其他子系统组件的调用}
}// 客户端
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operation();}
}
4. 外观模式的应用与实例
4.1 图形界面库的外观模式应用
在图形界面库中,可能存在各种复杂的子系统组件,如窗口、按钮、标签等。使用外观模式可以将这些组件封装在一个高层的外观类中,客户端只需通过外观类来操作这些组件,从而简化了客户端的使用过程。
4.2 文件压缩与解压缩的外观模式应用
在文件压缩与解压缩过程中,可能需要调用各种算法和组件来完成。使用外观模式可以将这些复杂的操作封装在一个高层的外观类中,对外提供简单的接口,使得客户端可以方便地进行文件压缩和解压缩的操作。
4.3 订单处理系统的外观模式应用
在订单处理系统中,可能涉及到多个子系统组件,如库存管理、支付系统、物流跟踪等。使用外观模式可以将这些组件封装在一个高层的外观类中,对外提供统一的接口,使得客户端可以方便地处理订单,而不需要关注底层子系统的具体实现细节。
下面是一个简单的订单处理系统的外观模式示例:
// 库存管理子系统
class InventorySystem {public void updateInventory(String productId, int quantity) {// 更新库存逻辑System.out.println("更新库存:产品ID:" + productId + " 数量:" + quantity);}
}// 支付系统子系统
class PaymentSystem {public void processPayment(String orderId, double amount) {// 处理支付逻辑System.out.println("支付处理:订单ID:" + orderId + " 金额:" + amount);}
}// 物流跟踪子系统
class LogisticsSystem {public void shipOrder(String orderId) {// 发货逻辑System.out.println("发货处理:订单ID:" + orderId);}
}// 外观类 - 订单处理系统
class OrderProcessingFacade {private InventorySystem inventorySystem;private PaymentSystem paymentSystem;private LogisticsSystem logisticsSystem;public OrderProcessingFacade() {inventorySystem = new InventorySystem();paymentSystem = new PaymentSystem();logisticsSystem = new LogisticsSystem();}public void processOrder(String productId, int quantity, double amount) {String orderId = generateOrderId();// 更新库存inventorySystem.updateInventory(productId, quantity);// 处理支付paymentSystem.processPayment(orderId, amount);// 发货logisticsSystem.shipOrder(orderId);// 其他订单处理的逻辑// ...}private String generateOrderId() {// 生成订单ID的逻辑return "12345";}
}// 客户端代码
public class Client {public static void main(String[] args) {OrderProcessingFacade facade = new OrderProcessingFacade();String productId = "ABC123";int quantity = 10;double amount = 100.0;facade.processOrder(productId, quantity, amount);}
}

在上述示例中,我们模拟了一个订单处理系统,包含了库存管理、支付系统和物流跟踪等子系统组件。通过外观模式,我们将这些子系统组件封装在OrderProcessingFacade外观类中,并提供了统一的接口processOrder用于处理订单。
客户端代码中,创建了一个OrderProcessingFacade实例,并调用processOrder方法来处理订单。客户端无需关注底层子系统的具体实现细节,只需要通过外观类来操作订单,从而简化了客户端的使用过程。
注意:上述示例为了简化演示,并未添加详细的业务逻辑,实际应用中可能需要更加完善的实现。
5. 外观模式的优缺点
5.1 优点
- 简化接口,降低使用难度:外观模式提供了一个简单的高层接口,隐藏了底层子系统的复杂性,使得客户端更容易使用。
- 解耦子系统,提高灵活性和可维护性:通过外观类,将客户端与子系统分离,使得子系统的变化不会影响到客户端,提高了系统的灵活性和可维护性。
- 提供高层次接口,简化系统架构:外观模式可以作为系统的一部分,提供更高层次的接口,简化了系统的架构。
5.2 缺点
- 违背开闭原则:如果需要新增或修改功能,可能需要修改外观类的代码。
- 不符合单一职责原则:外观类承担了过多的责任,可能变得庞大而复杂。
6. 总结
外观模式,也称为门面模式,是一种结构型设计模式,旨在将复杂的子系统封装为一个简单易用的接口,以减少系统的复杂度并提高代码的可维护性和灵活性。
外观模式通过定义一个高层接口来隐藏子系统的底层复杂性,使得客户端无需了解和调用复杂的子系统逻辑和接口,而只需调用简单易用的外观类接口即可完成相应的操作。这样,极大地简化了客户端调用代码,并提高了代码的可读性、可维护性和扩展性。
外观模式对于软件开发有着很多的积极影响:
-
降低系统复杂度:外观模式可以将系统中复杂的子系统进行封装,从而将系统的复杂度降低到合理的水平。
-
提高代码可维护性:外观模式将子系统进行封装,减少了客户端与子系统之间的耦合,从而让系统变得更加易于维护。
-
提高代码的可读性:外观模式将子系统的复杂逻辑隐藏在外观类后面,使得代码变得更加简洁、易读。
-
改善代码的结构性:外观模式可以提高代码的结构性,使得代码更加规范、易懂。
-
提高代码的可扩展性:外观模式提供了一个简单的接口,当需要添加新的子系统时,只需要在外观类中添加相应的方法实现,而不影响客户端代码。
总的来说,外观模式在软件开发中有着广泛的应用,它能够显著地提高代码的可维护性、可读性、可扩展性和结构性。同时,它也有助于降低软件的复杂度,使得软件开发变得更加简单、易于实现。
相关文章:
外观模式:简化复杂子系统的访问与使用
文章目录 1. 简介2. 外观模式的基本结构3. 外观模式的实现步骤4. 外观模式的应用与实例4.1 图形界面库的外观模式应用4.2 文件压缩与解压缩的外观模式应用4.3 订单处理系统的外观模式应用 5. 外观模式的优缺点5.1 优点5.2 缺点 6. 总结 1. 简介 外观模式是一种结构型设计模式&…...
代码随想录day38|509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯
509. 斐波那契数 class Solution:def fib(self, n: int) -> int:#dp含义,递推公式,dp初始化,遍历顺序,打印dpif n 0:return 0dp [0] * (n1)dp[0]0dp[1]1for i in range(2,n1):dp[i] dp[i-1] dp[i-2]return dp[n] 70. 爬楼梯…...
UE5 C++ UGameInstance 功能、作用及应用
# UE5 C UGameInstance 功能及作用 网上有很多文章介绍,例如在游戏中只有一个实例,换关卡不会丢失等。暂时省略。 # UE5 C UGameInstance 应用 ## 应用一,UE5 C UGameInstance 里监听player创建事件 UWebSocketGameInstance.h里的定义 …...
NodeJs-http模块
目录 一、概念二、请求报文的组成三、响应报文的组成四、创建http服务4.1 操作步骤4.2 注意事项 五、获取 HTTP 请求报文5.1 获取请求报文5.2 提取路径和查询字符串 六、设置 HTTP 响应报文七、MIME设置资源类型 一、概念 HTTP(hypertext transport protocol&#…...
翻译句子 前面的路是非常狭窄的 不能翻译成 the ahead of road is narrow 的原因
翻译句子 前面的路是非常狭窄的。The road ahead is very narrow. 可以将句子翻译成 “The ahead of road is narrow.”,但这个翻译可能不太符合英语的表达习惯。更常见的表达方式是 “The road ahead is narrow.”,这样更符合英语的语法和习惯用法。 …...
NTT功能与实现
NTT的基础功用与拓展功能: 1.evaluate和interpolate evaluate的本质是选择n个点(假设f(x)的度为n),计算得到其值,因此根据定义可以直接进行代入计算。为了加快计算的过程选取 w n w_n wn的幂次(DFT问题即离散傅里叶变换),使用FFT算法来加…...
Flutter(九)Flutter动画和自定义组件
目录 1.动画简介2.动画实现和监听3. 自定义路由切换动画4. Hero动画5.交织动画6.动画切换7.Flutter预置的动画过渡组件自定义组件1.简介2.组合组件3.CustomPaint 和 RenderObject 1.动画简介 Animation、Curve、Controller、Tween这四个角色,它们一起配合来完成一个…...
【python】可视化
柱状图 matplotlib之pyplot模块之柱状图(bar():基础参数、外观参数)_plt.bar_mighty13的博客-CSDN博客 bar()的基础参数如下: x:柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组! height&…...
C++继承多接口,调用虚函数跳转到错误接口的虚函数的奇怪问题
问题重现 定义了两个接口IA IB class IA{public:virtual void funA() = 0; }; class IB{public:virtual void funB() = 0; }...
C++:日期类
学习目标: 加深对四个默认构造函数的理解: 1.构造函数 2.析构函数 3.拷贝构造 4.运算符重载 实现功能 1.比较日期的大小 2.日期-天数 3.前/后置,-- 这里基本会使用运算符重载 定义一个日期类 class Date { public://1.全缺省参数的构造函数Da…...
c++ 学习之 构造函数的使用
上代码 class person { public:person(){cout << " person 的无参默认构造函数 " << endl;}person(int age){cout << " person 的有参默认构造函数 " << endl;m_age age;}person(const person& other){cout << "…...
算法通关村15关 | 超大规模数据场景常见问题
1.用4KB内存寻找重复元素 题目:给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。 分析: 本身是…...
qemu编译与使用
文章目录 1、安装依赖2、下载qemu源码3、编译4、运行5、qemu参数 qemu 是一个硬件虚拟化程序(hypervisor that performs hardware virtualization),与传统的 VMware / VirtualBox 之类的虚拟机不同,它可以通过 binary translation…...
bazel远程构建(Remote Execution)
原理 既然 ActionResult 可以被不同的 Bazel 任务共享,说明 ActionResult 和 Action 在哪里执行并没有关系。因此,Bazel 在构建时,可以把 Action 发送给另一台服务器执行,对方执行完,向 CAS 上传 ActionResult&#x…...
uniapp 微信小程序仿抖音评论区功能,支持展开收起
最近需要写一个评论区功能,所以打算仿照抖音做一个评论功能,支持展开和收起, 首先我们需要对功能做一个拆解,评论区功能,两个模块,一个是发表评论模块,一个是评论展示区。接下来对这两个模块进行…...
js:创建一个基于vite 的React项目
相关文档 Vite 官方中文文档React 中文文档React RouterRedux 中文文档Ant Design 5.0Awesome React 创建vite react项目 pnpm create vite react-app --template react# 根据提示,执行命令 cd react-app pnpm install pnpm run dev项目结构 $ tree -L 1 . ├─…...
论文阅读_医疗知识图谱_GraphCare
英文名称: GraphCare: Enhancing Healthcare Predictions with Open-World Personalized Knowledge Graphs 中文名称: GraphCare:通过开放世界的个性化知识图增强医疗保健预测 文章: http://arxiv.org/abs/2305.12788 代码: https://github.com/pat-jj/GraphCare 作…...
Android 蓝牙开发( 四 )
前言 上一篇文章给大家分享了Kotlin版的Android蓝牙的基础知识和基础用法,不过上一篇都是一些零散碎片化的程序,,这一篇给大家分享Android蓝牙开发实战项目KotlinCompose的初步使用 效果演示 : Android Compose 蓝牙开发 Android蓝牙实战开发…...
涂鸦智能携手亚马逊云科技 共建“联合安全实验室” 为IoT发展护航
2023年8月31日,全球化IoT开发者平台涂鸦智能(NYSE: TUYA,HKEX: 2391)在“2023亚马逊云科技re:Inforce中国站”大会宣布与全球领先的云计算公司亚马逊云科技共同成立“联合安全实验室”,旨在加强IoT行业的安全合规能力与…...
Oracle21C--Windows卸载与安装
卸载方法: (1)WinR,输入services.msc,打开服务,把Oracle相关的服务全部停止运行(重要) (2)WinR,输入regedit,打开注册表,删除Oracle开…...
CentOS 7下‘Development Tools’和‘开发工具’组有区别吗?实测告诉你答案
CentOS 7下‘Development Tools’与‘开发工具’的隐藏关联:技术细节全解析在Linux系统管理中,yum的软件包组功能一直是个既实用又充满谜团的领域。特别是当系统语言环境与软件包元数据语言不一致时,开发者们常常会遇到一个有趣的现象&#x…...
基于Arduino与应变片传感器的高精度厨房电子秤DIY全攻略
1. 项目概述:用Arduino打造一台高精度厨房电子秤作为一个喜欢在厨房里折腾的硬件爱好者,我经常遇到需要精确称量食材的场合。市面上的电子秤要么精度不够,要么价格不菲,要么功能单一。于是,我萌生了自己动手做一台的想…...
ComfyUI-Manager完全指南:掌握AI工作流管理的核心技术
ComfyUI-Manager完全指南:掌握AI工作流管理的核心技术 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custo…...
三步破解百度网盘限速:免费获取真实下载链接的终极指南
三步破解百度网盘限速:免费获取真实下载链接的终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘几十KB的龟速下载而苦恼吗?想要彻…...
使用Taotoken CLI工具一键配置多开发环境下的统一模型接入点
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken CLI工具一键配置多开发环境下的统一模型接入点 在团队协作或管理多个AI应用项目时,一个常见的痛点是每个…...
解锁你的音乐收藏:浏览器端音频解密完整指南
解锁你的音乐收藏:浏览器端音频解密完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcod…...
PDF差异对比神器diff-pdf:告别文档核对烦恼,提升工作效率的智能解决方案
PDF差异对比神器diff-pdf:告别文档核对烦恼,提升工作效率的智能解决方案 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 你是否曾在核对PDF文档时感到头疼…...
免费解锁八大网盘限速!LinkSwift直链下载助手终极指南
免费解锁八大网盘限速!LinkSwift直链下载助手终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...
不止是移动:用UE5.1蓝图优化你的MetaHuman性能(头发渲染、LOD设置避坑指南)
不止是移动:用UE5.1蓝图优化你的MetaHuman性能(头发渲染、LOD设置避坑指南)在虚幻引擎5.1中,MetaHuman已经成为了数字人创作的重要工具。然而,许多开发者在实现了基础移动控制后,往往会忽视对MetaHuman资产…...
如何免费激活VMware Workstation Pro 17:完整密钥获取与安装指南
如何免费激活VMware Workstation Pro 17:完整密钥获取与安装指南 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major versions o…...
