设计模式- 外观模式(Facade Pattern)结构|原理|优缺点|场景|示例

                                    设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)       策略模式        模板方法模式        观察者模式        迭代器模式        责任链模式        命令模式

                                   备忘录模式          状态模式          访问者模式        中介者模式    


外观模式(Facade Pattern)是一种结构型设计模式,其目的是为子系统提供一个统一的、更高级别的接口,使得客户端能够更容易地与子系统进行交互,而不必了解子系统的内部细节。外观模式通过创建一个外观类(Facade),封装了子系统中的复杂接口或多个子系统接口,提供一个更简洁、更易于使用的接口给客户端,从而降低了客户端与子系统之间的耦合度。

模式结构

外观模式通常包含以下角色:

  1. 子系统(Subsystem):由多个类组成的模块或系统,每个类负责子系统的一部分功能。子系统并不知道外观的存在,对于子系统而言,外观只是另一个客户端。

  2. 外观(Facade):为子系统提供一个统一的接口,定义了一个高层接口,使得子系统更加容易使用。外观知道哪些子系统类负责处理请求,将客户端的请求转发给适当的子系统对象处理,并可以决定哪些子系统对象参与处理请求。

工作原理

  • 客户端:通过外观类与子系统进行交互,无需直接与子系统内部的复杂接口或多个接口打交道,简化了客户端的使用。
  • 外观:为客户端提供一个简单易用的接口,接收客户端的请求,并将请求转发给相应的子系统对象进行处理。外观可以协调子系统对象的交互,或者添加额外的逻辑来处理请求。
  • 子系统:负责实现具体的业务逻辑。子系统并不知道外观的存在,它们独立于外观进行开发和演化。

优缺点

优点
  • 简化接口:为子系统提供了一个简化的接口,降低了客户端与子系统的耦合度。
  • 减少复杂性:隐藏了子系统的复杂性,使得客户端无需了解子系统的内部结构和实现细节。
  • 易于使用和扩展:客户端只需与外观交互,简化了系统的使用,同时新增或修改子系统时,只需调整外观类,不影响客户端代码。
缺点
  • 违反开闭原则:若新增子系统功能,可能需要修改外观类,这在一定程度上违反了“开闭原则”。
  • 可能增加系统的复杂性:若设计不当,外观类可能会过于庞大,成为另一个难以维护的中心点。

适用场景

  • 子系统接口复杂,不易理解和使用:当子系统包含多个接口,或者接口方法众多且使用复杂时,可以使用外观模式提供一个简单易用的接口。
  • 需要简化并统一子系统接口:在不同子系统之间存在大量交互,或者客户端需要与多个子系统交互时,可以通过外观模式提供一个统一的接口。
  • 希望减少客户端与子系统之间的耦合:通过外观模式隔离客户端与子系统的直接联系,使得两者可以独立演化。

代码示例(以Java为例)

// 子系统类
class SubsystemA {public void operation() {System.out.println("Subsystem A performing operation.");}
}class SubsystemB {public void operation() {System.out.println("Subsystem B performing operation.");}
}class SubsystemC {public void operation() {System.out.println("Subsystem C performing operation.");}
}// 外观类
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();subsystemC = new SubsystemC();}public void performComplexOperation() {System.out.println("Starting complex operation...");subsystemA.operation();subsystemB.operation();subsystemC.operation();System.out.println("Complex operation completed.");}
}// 客户端代码
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.performComplexOperation();}
}

在这个Java示例中:

  • SubsystemASubsystemBSubsystemC类代表子系统中的不同部分,各自实现了一个operation()方法。
  • Facade类作为外观,封装了子系统类,提供了performComplexOperation()方法,该方法调用子系统的operation()方法以执行复杂的操作序列。
  • 客户端代码通过Facade对象调用performComplexOperation()方法,无需直接与子系统类交互,简化了客户端代码。

代码示例(以Python为例)

# 子系统类
class SubsystemA:def operation(self):print("Subsystem A performing operation.")class SubsystemB:def operation(self):print("Subsystem B performing operation.")class SubsystemC:def operation(self):print("Subsystem C performing operation.")# 外观类
class Facade:def __init__(self):self.subsystem_a = SubsystemA()self.subsystem_b = SubsystemB()self.subsystem_c = SubsystemC()def perform_complex_operation(self):print("Starting complex operation...")self.subsystem_a.operation()self.subsystem_b.operation()self.subsystem_c.operation()print("Complex operation completed.")# 客户端代码
def main():facade = Facade()facade.perform_complex_operation()if __name__ == "__main__":main()

 在这个Python示例中:

  • SubsystemASubsystemBSubsystemC类代表子系统中的不同部分,各自实现一个operation()方法。
  • Facade类作为外观,封装了子系统类,提供了perform_complex_operation()方法,该方法调用子系统的operation()方法以执行复杂的操作序列。
  • 客户端代码通过Facade对象调用perform_complex_operation()方法,无需直接与子系统类交互,简化了客户端代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁(spin lock)原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流:可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

C++智能指针详解

目录 一. 智能指针初识 1.1 什么是智能指针 1.2 智能指针历史历程 1.3 为什么需要智能指针 1.3.1 内存泄漏 1.3.2 防止内存泄漏 1.3.3 异常的重新捕获 二. 智能指针的原理与使用 2.1 智能指针的原理 2.2 智能指针的使用 2.3 智能指针的拷贝问题…

docker网络和模式

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个…

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路记录,给大家提供一下以后排查定位问题的方向 问题场景相关代码: 1.项目本身代码: 2.精简了关键性代码后,就可以去ge…

【博客经验分享】博客小白在CSDN是如何做到一周内涨粉1800的

🎓我(异构算力老群群-CSDN博客)是在今年3月份才开始写博客的,目的是做一个博士🎓期间的笔录;在CSDN这个技术分享与交流的平台🌐,我近期实现了一个令人振奋的成就——那就是一周内涨粉…

纯血鸿蒙APP实战开发——评论组件案例实现

介绍 评论组件在目前市面上的短视频app中是一种很常见的场景,本案例使用全局状态保留能力弹窗来实现评论组件。点击评论按钮弹出评论组件,点击空白处隐藏该组件,再次点击评论按钮则会恢复上一次浏览的组件状态。 效果图预览 使用说明 点击…

CUDA的基础知识

文章目录 数据精度CUDA概念线程&线程块&线程网络&计算核心GPU规格参数内存 GPU并行方式数据并行流水并行张量并行混合专家系统 数据精度 FP32 是单精度浮点数,用8bit 表示指数,23bit 表示小数;FP16 是半精度浮点数,用…

L1-041 寻找250

作者 陈越 单位 浙江大学 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。 输出格式&a…

【进程通信】利用管道创建进程池(结合代码)

文章目录 什么叫进程池进程池的优点 创建进程池代码实现: 什么叫进程池 我们知道,一个进程创建子进程通常是为了让这个子进程去为它完成某个任务。例如我们使用的指令,其实就是bash进程创建子进程让子进程去执行的。但是我们需要考虑这样一个…

【介绍下分布式系统】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

wegame启动游戏错误代码126,加载x3daudio1_7.dll失败的修复教程

在尝试通过WeGame平台启动某款游戏时,遇到了阻碍,系统反馈了一个特定的错误代码“错误代码126,加载x3daudio1_7.dll失败”。这个错误提示表示游戏无法加载x3daudio17.dll文件,导致游戏无法正常启动。经过一番研究和尝试&#xff0…

vue elementui el-table表格 点击单元格添加选中样式

注意: 1、点击某行单元格添加选中样式; 2、表格第一列数据单独添加样式,比如:加粗; 3、表格表头添加样式,比如:修改背景色; 先上代码(效果图在文章末尾)&…

python-pytorch 如何使用python库Netron查看模型结构(以pytorch官网模型为例)0.9.2

Netron查看模型结构 参照模型安装Netron写netron代码运行查看结果需要关注的地方 2024年4月27日14:32:30----0.9.2 参照模型 以pytorch官网的tutorial为观察对象,链接是https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html 模型代…

Ansible自动化

Ansible自动化 自动化的需求: 1. 在什么样的场景下需要自动化? 批量化的工作: 装软件包、配置服务、升级、下发文件… 2. 为什么在自动化工具中选择ansible? 对比shell脚本: 相对于用shell的脚本来实现自动化&#x…

42.接雨水

接雨水是一个非常经典的题目了,我在二刷的时候,终于能独立做了,在记录一下灵神的横着计算的单调栈思想. 法一: 竖着计算 奇思妙想 让我们想想,接到的雨水到底是存储哪里了呢,其实他就是凹陷部分,而什么是凹陷呢,就是从左边看,从右边看都发现不了的地方. …

滑块验证码破解----Java使用opencv后端破解滑块验证

使用技术:Java SpringBootopenCV 在windows上首先需要下载opencv进行安装,先去官网:Releases - OpenCV 下载这个windows版本的安装包 下载后直接安装解压就行,然后需要,然后找到安装位置里的这个文件: 你下载的是什么版本的,这里的数字就是多少,比如我下载4.5.3版本那么这…

永磁同步电机SMO负载转矩观测matlab模型。

永磁同步电机SMO负载转矩观测matlab模型。 负载转矩的有效识别是提高伺服驱动系统抗负载扰动性能的关键之一。现在的传统结构的LTID滑模观测器存在频率抖动大,估计精度差的缺点,限制了其在高性能伺服系统中的应用。 本模型推导分析了传统LTID滑模观测器…

eclipse 如何创建python文件

一、准备 1.平台要求: 电脑除了要安装eclipse软件和Python语言包之外,还需要将Python集成到eclipse软件中,网上有很多的方法,这里就不细细介绍如何集成了。 在下面界面中可以看到自己已经安装了继承插件。具体方法见步骤2&…

AI新篇章:全面解读ChatGPT3.5与GPT4.0的革命性融合

MidTool(kk.zlrxjh.top),一个集成了多种先进人工智能技术的助手,融合了ChatGPT3.5、GPT4.0、DALLE 3和Midjourney等多个智能服务,提供多功能体验。下面是对这些技术的简要概述: **ChatGPT3.5**:…

可视化智慧工厂

在科技迅猛发展的今天,制造业正迎来一场深刻的变革——智慧工厂的崛起。可视化智慧工厂作为其中的重要一环,以其直观、高效、智能的特点,正成为制造业转型升级的关键所在。 一、什么是可视化智慧工厂? 传统的制造业生产方式往往依赖于人工…