不得不说的结构型模式-外观模式

news/2024/4/27 3:50:47/文章来源:https://blog.csdn.net/clayhell/article/details/130313764

目录

​编辑

1. 什么是外观模式

1.1外观模式的结构:

2实际案例:

3下面是面试中关于装饰器模式的常见的问题:

3.1下面是问题的答案:


1. 什么是外观模式

Facade模式也叫外观模式, Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。其实也就是提供一个统一的接口,来访问子系统中一群功能相关接口。外观模式定义了一个高层接口,让子系统更容易使用。

外观模式通过定义一个高层接口,来统一封装一系列底层子系统的接口,从而降低了系统的复杂性,并提高了系统的可维护性和可扩展性。

在C++中,外观模式通常由一个Facade类来实现。这个类包含了一系列高层接口,用于封装子系统中的底层接口。客户端可以通过Facade类来使用这些高层接口,而无需了解底层子系统的实现细节。在实现外观模式时,我们通常还需要定义一些底层子系统的类,这些类提供了具体的实现细节。在Facade类中,我们会将这些底层子系统的对象组合起来,并对外提供高层接口。

外观模式的实际应用场景非常广泛,比如说,我们可以使用外观模式来简化复杂的API,隐藏一些不必要的接口,提供更加友好的界面;还可以使用外观模式来封装底层子系统的实现细节,从而实现系统的解耦和高内聚;另外,外观模式还可以用来简化多个类之间的交互,从而减少系统中的复杂度。

1.1外观模式的结构:

 

  • Facade:为调用方定义简单的调用接口。

  • Clients: 调用者。通过Facade接口调用提供某功能的内部类群。

  • Packages :功能提供者。指提供功能的类群(模块或子系统)

2实际案例:

下面是一个简单的外观模式示例,假设我们有一个子系统包含了两个类:类A和类B,它们分别提供了接口a()和接口b()。客户端想要使用这两个接口,但是不想了解它们的实现细节,这时候可以使用外观模式来简化客户端代码:

#include <iostream>// 定义类A,提供接口a()
class A {
public:void a() {std::cout << "A::a()" << std::endl;}
};// 定义类B,提供接口b()
class B {
public:void b() {std::cout << "B::b()" << std::endl;}
};// 定义外观类Facade,封装类A和类B的接口
class Facade {
public:Facade() {// 在构造函数中创建类A和类B的对象m_A = new A();m_B = new B();}~Facade() {// 在析构函数中释放类A和类B的对象delete m_A;delete m_B;}// 提供高层接口,调用类A和类B的接口void highLevelApi() {m_A->a();m_B->b();}private:A* m_A;B* m_B;
};int main() {// 客户端使用外观类Facade facade;facade.highLevelApi();return 0;
}

在这个示例中,类A和类B提供了各自的接口,而外观类Facade封装了它们的接口。在客户端中,只需要创建一个外观类的对象,然后调用外观类的高层接口即可。客户端不需要了解类A和类B的实现细节,也不需要关心它们之间的交互方式,因为这些细节都被封装在Facade类中。

3下面是面试中关于装饰器模式的常见的问题:

  1. 什么是外观模式?
  2. 外观模式的主要目的是什么?
  3. 外观模式与其他模式的区别是什么?
  4. 外观模式的优缺点是什么?
  5. 你能否举一个实际应用场景来说明外观模式的使用?

可以尝试自己思考一下,你的看法是什么,然后再看看答案,对比一下,看看有什么遗漏的地方=v=.

3.1下面是问题的答案:

  1. 外观模式是一种结构型设计模式,它通过为子系统中的一组接口提供一个统一的接口,来简化客户端与子系统之间的交互。外观模式将客户端与复杂的子系统分离开来,使得客户端不必了解子系统的内部实现细节。
  2. 外观模式的主要目的是简化复杂系统的接口,减少客户端与子系统之间的耦合。外观模式通过为子系统提供一个统一的接口,使得客户端可以更容易地使用子系统,同时也使得子系统更容易被维护和扩展。
  3. 外观模式与其他模式的区别在于它关注的是接口的简化和统一,而不是对象的创建和组合。外观模式通常涉及到的类只有一个,即外观类,而其他模式可能会涉及到多个类和对象。
  4. 外观模式的优点包括:
    • 简化客户端与子系统之间的交互,降低了客户端代码的复杂度和耦合度。
    • 提高了系统的可维护性和可扩展性,因为外观类作为一个中介层,可以隔离子系统的变化对客户端的影响。
    • 提高了系统的安全性,因为客户端无法直接访问子系统的内部接口,从而减少了潜在的安全风险。 外观模式的缺点包括:
    • 如果子系统的接口发生了变化,外观类也需要进行相应的修改。
    • 外观类的引入会增加系统中的一个间接层,有可能会影响到系统的性能和扩展性。
  5. 一个实际应用场景是在操作系统中,为了方便用户使用,通常会提供一组系统调用接口。这些接口涉及到许多复杂的操作,如文件系统操作、网络连接操作、进程管理等。为了简化用户的操作,操作系统通常会对这些接口进行封装,提供一个统一的接口,供用户使用。

欢迎大家讨论留言,批评指正,共同学习,共同进步!

 

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

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

相关文章

opencv-python视频分析与目标跟踪

目录 光流 目标跟踪 一、光流 使用OpenCV光流分析&#xff0c;跟踪蚂蚁的轨迹&#xff1a; 代码实现&#xff1a; import numpy as np import cv2if __name__ __main__:cap cv2.VideoCapture(ant.mp4)# ShiTomasi 角点检测参数feature_params dict(maxCorners100,quali…

Python边缘检测之prewitt, sobel, laplace算子

文章目录 滤波算子简介具体实现测试 滤波算子简介 ndimage中提供了卷积算法&#xff0c;并且建立在卷积之上&#xff0c;提供了三种边缘检测的滤波方案&#xff1a;prewitt, sobel以及laplace。 在convolve中列举了一个用于边缘检测的滤波算子&#xff0c;统一维度后&#xf…

3.微服务项目实战---Nacos Discovery--服务治理

3.1 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08; ip &#xff0c;端口&#xff09;等硬编码到了代码中&#xff0c;这种做法存在许多问题&#xff1a; 一旦服务提供者地址…

精进云原生 - Dubbo 3.2 正式发布

作者&#xff1a;Dubbo 社区 我们非常高兴地宣布&#xff0c;Dubbo 3.2 已经正式发布了&#xff01;这个版本带来了许多新功能和改进&#xff0c;这也是 Dubbo 在面对云原生化的当下的一次重要的尝试。 背景介绍 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微…

虹科分享 | 如何主动保护个人信息 | 网络安全评级

网上报税和支付越来越流行&#xff0c;针对毫无防备的纳税人的税务欺诈也越来越频繁。以下是一些需要避免的常见网上税务骗局&#xff1a; 网络钓鱼诈骗 骗子利用电子邮件、短信或电话伪装成相关机构或报税软件提供商&#xff0c;诱骗人们提供他们的个人信息&#xff0c;或点击…

【云计算•云原生】1.什么是云计算?它为什么这么火?

文章目录 1.云计算基础什么是云计算云计算的分类开源软件、自由软件、免费软件 2.云计算机制云基础设施机制云管理机制云安全机制基本云架构 3.虚拟化技术服务器虚拟化服务器虚拟化技术CPU虚拟化内存虚拟化设备和I/O虚拟化存储虚拟化网络虚拟化桌面虚拟化 KVM 4.网络与存储基础…

实测有效!手把手带你将 Docker Image 体积减少 90%

Docker Image 体积越大,那部署要花的时间就越长;假如每个版本都有好几 GB,那并不是一个理想的状态;因此笔者开始动手实作,想看看到底能将 Docker Image 的体积缩小多少! 大纲 ㄧ、先初始化一个简易的 Node.js 专案 二、撰写 Dockefile,了解优化前体积有多大 三、使用 No…

通信算法之145:OFDM系统频偏(IFO/FFO)对频域信号影响

carrier frequency offset 1. 整数倍频偏IFO&#xff0c;频域数据相对发送端的数据出现了循环移位&#xff0c;子载波仍然正交。 2.小数倍频偏FFO&#xff0c;频域数据幅度和相位都发生变化&#xff0c;引入了ICI。 无频偏正常星座图 代码&#xff1a;待补充 读者1/2:

2023.4.23第五十次周报

目录 前言 文献阅读&#xff1a;基于ARIMA-WOA-LSTM模型的空气污染物预测 背景 ARIMA-WOA-LSTM模型 思路 主要贡献 积分移动平均自回归 &#xff08;ARIMA&#xff09; 鲸鱼优化算法 搜索超参数 CEEMDAN 结论 LSTM-Kriging 主要目标 理论猜想 问1&#xff1a…

Opencv+Python笔记(九)模板匹配

模板匹配 模板匹配常用于对象检测&#xff0c;且实现简单计算效率高。但如果输入图像中存在变化因素如旋转、缩放、视角变化等&#xff0c;模板匹配很容易失效 模板匹配原理&#xff1a; 1.匹配方式为模板 (a * b) 在原图像 (m * n) 上滑动 使用参数method中指定的方法&#…

IJKPLAYER源码分析-常用API

前言 本文简要介绍IJKPLAYER的几个常用API&#xff0c;以API使用的角度&#xff0c;来审视其内部运作原理。这里以iOS端直播API调用切入。 调用流程 init 创建播放器实例后&#xff0c;会先调用init方法进行初始化&#xff1a; - (IJKFFMediaPlayer *)init {self [super ini…

ChatGLM-6B 中文对话模型复现、调用模块、微调及部署实现(更新中)

ChatGLM-6B-PT 一、前言 近期&#xff0c;清华开源了其中文对话大模型的小参数量版本 ChatGLM-6B&#xff08;GitHub地址&#xff1a;https://github.com/THUDM/ChatGLM-6B&#xff09;。其不仅可以单卡部署在个人电脑上&#xff0c;甚至 INT4 量化还可以最低部署到 6G 显存的…

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)

论文信息 题目&#xff1a; RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址&#xff1a; https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊&#xff1a; IEEE Access ( Volum…

新手必看!ChatGPT常见问题总整理,你遇到了几个?

随着ChatGPT火爆全球,使用人数以指数型成长,许多使用上的问题呈现在网路上。 今天这篇文章会用实作的方式带大家了解ChatGPT有哪些常见问题,以此减少踩坑的机会。 并用简单的示例让大家感受GPT-3.5与GPT-4的能力差异,希望对大家有所帮助。 大家会有这些问题,其实就是希望…

SequoiaDB分布式数据库2023.3月刊

本月看点速览 赋能行业&#xff0c;参编《分布式数据库金融应用发展报告》 脱颖而出&#xff0c;入选2022专精特新黑马大赛年度十强 激烈角逐&#xff0c;成功晋级全国信创优秀解决方案决赛 新穗新彩&#xff0c;多家权威媒体走进巨杉 青杉计划2023持续进行&#xff0c;一起…

从源码全面解析 ArrayBlockingQueue 的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

安卓手机(微信小程序)抓蓝牙通信数据包

前言 因为公司需要......所以我就弄了一下,参考了很多别人的文章。 成果:它可以抓取微信小程序、安卓APP的蓝牙数据通信包。 开始 我是小米手机,所以我以我自己手机为例 通信过程操作 第一步 打开开发者选项,打开蓝牙调试日志和蓝牙数据包日志开关(如果两者只有其中…

MAVEN环境变量配置(Windows 11)

1、直接在搜索框中搜&#xff1a;编辑系统环境变量 2、点击环境变量 3、 在系统变量里面新建系统变量 变量名&#xff1a;MAVEN_HOME 变量值&#xff1a;路径一定要写到maven的bin目录下 以下这种写法是错误的 4、新建系统变量完成 5、 往下滑 找到path&#xff0c;可以双击…

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开&#xff0c;因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验&#xff0c;以及GPT-4的预期功能推测一些可能的使用步骤&#xff1a; 选择适合的GPT-4实现技术&#xff1a;GPT-4可能有不同的实现技术&#xff…

Opencv+Python笔记(八)轮廓检测

目录 一、轮廓的检测和绘制1.读入图像2.将读入图像转化为灰度图3.对灰度图进行二值化 [图像的阈值化处理](https://blog.csdn.net/Ggs5s_/article/details/130301816?spm1001.2014.3001.5501)4.进行轮廓检测5.在原图中显示轮廓 二、轮廓层级关系1.RET_LIST2.RETR_EXTERNAL3. R…