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

news2025/1/13 10:57:08

目录

​编辑

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.coloradmin.cn/o/468211.html

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

相关文章

3ASC25H214 DATX130以力控制为基础的装配应用方面已经形成了一个解决方案

​ 3ASC25H214 DATX130以力控制为基础的装配应用方面已经形成了一个解决方案 ABB的机器人解决方案最终选择了IRB6400机器人 ABB的解决方案 ABB一直都在不断地研究和开发机器人应用的新技术&#xff0c;有一部分研究活动是与大学进行合作的&#xff0c;其中一项是ABB的科学家和…

数据建模方法论及实施步骤

了解数据建模之前首先要知道的是什么是数据模型。数据模型&#xff08;Data Model&#xff09;是数据特征的抽象&#xff0c;它从抽象层次上描述了系统的静态特征、动态行为和约束条件&#xff0c;为数据库系统的信息表示与操作提供一个抽象的框架。 一、概要&#xff1a;数据…

关于数据包丢失你需要知道的一切(以及如何避免它)

当数据从一个地方传输到另一个地方时,一些数据包可能会被延迟、损坏甚至丢失。这就是所谓的数据包丢失。这很常见,但这并不意味着你必须接受它! 数据包丢失、延迟、抖动——如果你注意到互联网性能不佳,你可能会遇到其中一种或多种情况。 延迟与速度有关,但什么是数据包…

AP9193 升压恒流驱动芯片 24V 36V1A三线三色 LED大功率方案

AP9193 是一款高效率、高精度的升 压型大功率 LED 灯恒流驱动控制芯片。 应用领域 LED 灯杯 电池供电的 LED 灯串 平板显示 LED 背光 恒流充电器控制 大功率 LED 照明 AP9193 内置高精度误差放大器&#xff0c;固 定关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c; …

【云原生Kubernetes】01-Kubernetes简介

【云原生Kubernetes】01-Kubernetes简介 文章目录 【云原生Kubernetes】01-Kubernetes简介前言kubernets概述为什么要使用Kubernetes?Kubernetes能做什么&#xff1f;Kubenets架构架构图架构组件说明Master节点Node节点Etcd节点 组件间的工作流程 Kubernetes的核心技术Pod副本…

Spring boot 集成Skywalking

一、Skywalking官网 Apache SkyWalking 备注&#xff1a;本文使用的V9.0.0版本 二、SkyWalking服务端安装 1.下载SkyWalking APM 2.解压直接启动bin下的startup.bat 3. 日志查看 见logs/skywalking-oap-server.log 4.监控平台默认地址访问 http://127.0.0.1:8080 如需修…

九款顶级AI工具推荐

ChatGPT OpenAI开发的最强对话系统 地址&#xff1a;chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于&#xff0c;在网友们晒出的截图中&#xff0c;ChatGPT不仅能流畅地与用户对话&#xff0c;甚至能写诗、撰文、编…

任务调度框架Azkaban Flow1.0和Azkaban Flow2.0

目录&#xff1a; 一、Azkaban Flow1.0简介二、Azkaban Flow1.0基本任务调度三、Azkaban Flow1.0多任务调度四、Azkaban Flow1.0调度HDFS作业五、Azkaban Flow1.0调度MR作业六、Azkaban Flow1.0调度Hive作业七、Azkaban Flow1.0在线修改作业配置八、Azkaban Flow 2.0 简介九、A…

论文笔记:路网匹配算法综述

17年的老论文了&#xff0c;作为入门是可以的 1 Intro GPS信号和实际的轨迹是有一段距离的 如果对GPS数据不做处理直接定位&#xff0c;那么位置会被定位到非道路的建筑、湖泊、公园中&#xff0c;这显然是不合理的——>需要对GPS数据进行处理&#xff0c;使得其能较为准确…

nodejs搭建web框架开发web服务

首先安装nodejs,然后安装express MVC框架 1. npm install -g express 由于我写的是一个proxy代理服务所以我也安装了 http-proxy-middleware 【npm install -g http-proxy-middleware】 2.如果执行express&#xff0c;未能识别指令主要原因是因为环境变量中没有express.ex…

你真的使用过低代码产品吗?

低代码已经迅速成为现代软件开发的一个重要组成部分。其核心思想是加快和民主化应用程序开发过程。从开发人员的角度来看&#xff0c;这意味着他们可以用最少的编码来构建复杂的应用程序&#xff0c;使开发过程更快、更简单、更高效。对于企业用户来说&#xff0c;它使他们能够…

ChatGPT搭建AI网站实战

1.概述 ChatGPT是一款基于GPT-3.5架构的大型语言模型&#xff0c;它能够进行自然语言处理和生成对话等任务。作为一款智能化的聊天机器人&#xff0c;ChatGPT有着广泛的应用场景&#xff0c;如在线客服、智能助手、个性化推荐等。今天笔者给大家分享一下如何使用ChatGPT的API模…

创业一定要要组建团队吗?可以一个人独自创业吗,不能一概而论

创业团队&#xff0c;我们需要了解一个概念&#xff0c;那就是“群体”。 在生活中&#xff0c;我们经常会说这样一句话&#xff0c;人以群分&#xff0c;物以类聚。 每个人都不可能离开他人而独立存在&#xff0c;俗话说&#xff0c;“一个篱笆三个桩&#xff0c;一个好汉三个…

SAP批次分类完整检查的使用 (TCODE : BMCC)<转载>

原文链接&#xff1a;https://mp.weixin.qq.com/s/xzG6UqLmTcoLdEBeOnzfwA 最近批次物料收货遇到报错如下 分类数据中的不一致性>交易中止&#xff0c;消息号12126. 从报错字面意思看应该是批次分类属性出现了问题&#xff0c;具体是哪里不一致呢&#xff1f; 可以通过报…

20230427-tortoisegit报错-unsafe-repository

20230427-tortoisegit报错-unsafe-repository 一、软件环境 windows 11 x64 22H2git 2.35.3tortoisegit 2.14.0.0标签&#xff1a;git tortoisegit分栏&#xff1a;GIT 二、报错现象 右键打开tortoisegit&#xff0c;点击commit报错【fatal: unsafe … is owned by someone…

httphtml(HTML语法)

目录 1.http协议 1.Http简介 2.Http特点 3.Http协议格式 1&#xff09;客户端请求消息格式 2&#xff09;服务器响应消息格式&#xff1a; 2.Html简介 3.Html标签 1.标签格式&#xff1a; 2.标签分类&#xff1a; 3. 常用标签&#xff1a; 1&#xff09;h1-h6标题标…

高压放大器在医疗行业生物监测中的应用

最近几年&#xff0c;随着医学领域和先进技术的不断发展&#xff0c;生物监测也变得越来越重要&#xff0c;但是各种影响因素往往会导致研究出现很多问题。这个时候就需要高压放大器发挥作用。那么高压放大器在医疗行业生物监测中如何应用呢&#xff0c;我们一起来看看。 什么是…

这8个摸鱼神器,千万别让你老板知道!

工欲善其事&#xff0c;必先利其器&#xff0c;对于程序员来说也是如此&#xff0c;想早点下班就不能死脑筋&#xff0c;必须借助于一些开发工具来提高自己的工作效率&#xff0c;小编选取了8款任务/项目管理工具&#xff0c;能助你[打通任督二脉]&#xff0c;工作效率大大提升…

Linux 安装 Jenkins

#使用yum命令安装wget yum -y install wget# 进入usr目录,创建java文件夹 cd /usr mkdir Jenkins# 进入Jenkins目录 cd ./Jenkins# 配置jenkins的环境变量 vim /etc/profile# 输入i&#xff0c;进入编辑模式&#xff0c;加入以下配置 export JENKINS_HOME/usr/Jenkins# 保存并退…

二叉搜索树(BST)

二叉搜索树是一种二叉树&#xff0c;但它对树中元素的顺序作了限制。在二叉搜索树中&#xff0c;对于任意一个结点&#xff0c;它的左子树&#xff08;如果有&#xff09;中的所有元素值都小于它&#xff0c;它的右子树中的所有元素值都大于它。那么基于这个性质&#xff0c;对…