设计模式之外观设计模式

embedded/2024/9/24 8:06:31/

一、外观设计模式概念

外观模式 (Facade) 是一种结构型设计模式, 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  • 外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。
  • 外观模式实现了子系统与客户之间的松耦合关系。
  • 外观模式没有封装子系统的类,只是提供了简单的接口。 如果应用需要,它并不限制客户使用子系统类。因此可以再系统易用性与通用性之间选择。
  • 外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
  • 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。
  • 如果需要将子系统组织为多层结构, 可以使用外观。

外观设计模式的结构

  1. 外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。

  2. 创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。

  3. 复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。

    子系统类不会意识到外观的存在, 它们在系统内运作并且相互之间可直接进行交互。

  4. 客户端 (Client) 使用外观代替对子系统对象的直接调用。

代码如下:

    问题:有一套复杂的视频系统,以及以太复杂的音频系统。希望简化使用流程,提供简化的操作面板。
    解决方案:为子系统中的一组接口提供一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

#include <iostream>
#include <string>
//子系统1
class VedioSystem {
public:std::string initial()const{return "视频系统:Ready!\n";}std::string play()const{return "视频系统:Go!\n";}std::string operationX()const{return "视频系统:不常用的操作!\n";}};
//子系统2
class RadioSystem {
public:std::string init()const{return "音频系统:就绪!\n";}std::string play()const{return "音频系统:播放!\n";}std::string operationX()const{return "音频系统:不常用的操作!\n";}std::string mute()const{return "音频系统:静音!\n";}
};
//外观类
class Controller {
protected:VedioSystem* m_vedio;RadioSystem* m_radio;
public:Controller(VedioSystem* vedio = nullptr, RadioSystem* radio = nullptr){if (!vedio){m_vedio = vedio;}else{new VedioSystem();m_radio = radio ? radio : new RadioSystem();}}~Controller(){delete m_vedio;}std::string start()const{std::string string = "控制器启动视频系统\n";string += m_vedio->initial();string += m_radio->init();string += "控制器启动播放\n";string += m_vedio->play();string += m_radio->play();return string;}std::string mute()const{return "控制器静音\n" + m_radio->mute();}
};
int main()
{VedioSystem* vedio = new VedioSystem();RadioSystem* radio = new RadioSystem();Controller controller(vedio, radio);std::cout << controller.start() << std::endl;return 0;
}

 二、与其他模式的关系

  • 外观模式 (opens new window)为现有对象定义了一个新接口, 适配器模式 (opens new window)则会试图运用已有的接口。 适配器通常只封装一个对象, 外观通常会作用于整个对象子系统上。
  • 当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂模式 (opens new window)来代替外观 (opens new window)。
  • 享元模式 (opens new window)展示了如何生成大量的小型对象, 外观 (opens new window)则展示了如何用一个对象来代表整个子系统。
  • 外观 (opens new window)和中介者模式 (opens new window)的职责类似: 它们都尝试在大量紧密耦合的类中组织起合作。
    • 外观为子系统中的所有对象定义了一个简单接口, 但是它不提供任何新功能。 子系统本身不会意识到外观的存在。 子系统中的对象可以直接进行交流。
    • 中介者将系统中组件的沟通行为中心化。 各组件只知道中介者对象, 无法直接相互交流。
  • 外观 (opens new window)类通常可以转换为单例模式 (opens new window)类, 因为在大部分情况下一个外观对象就足够了。
  • 外观 (opens new window)与代理模式 (opens new window)的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。 代理与其服务对象遵循同一接口, 使得自己和服务对象可以互换, 在这一点上它与外观不同。

http://www.ppmy.cn/embedded/115993.html

相关文章

iText 5 通过创建 Document 对象,并使用 PdfWriter 将内容写入 PDF 文件

在 iText 5 中&#xff0c;你可以通过创建 Document 对象&#xff0c;并使用 PdfWriter 将内容写入 PDF 文件。以下是一个简单的例子&#xff0c;展示了如何根据样式填充数据生成 PDF 文件&#xff1a; 步骤 1: 添加 iText 5 依赖 首先&#xff0c;确保你的 Maven pom.xml 文…

ftok函数详解

ftok 是 Linux 和 Unix 系统中用于生成唯一键值&#xff08;key&#xff09;的函数&#xff0c;常用于进程间通信&#xff08;IPC&#xff09;机制&#xff0c;如共享内存&#xff08;shared memory&#xff09;、消息队列&#xff08;message queues&#xff09;和信号量&…

【二分算法】模板总结

目录 一、二分查找时间复杂度 二、二分查找模板 2.1 模板一&#xff1a;标准的二分查找 2.2 模板二&#xff1a;二分查找左边界 2.3 模板三&#xff1a;二分查找右边界 三、总结&#xff1a; 一、二分查找时间复杂度 时间复杂度可以表示 O(n)O(log2​n)或者O(n)O(logn) …

24年秋招,网安面试三十道题

php爆绝对路径方法&#xff1f; 单引号引起数据库报错 访问错误参数或错误路径 探针类文件如phpinfo 扫描开发未删除的测试文件 google hacking phpmyadmin报路径&#xff1a;/phpmyadmin/libraries/lect_lang.lib.php利用漏洞读取配置文件找路径 恶意使用网站功能&#xff0c…

2.pytest框架实现一些前后置(固件,夹具)的处理,断言和allure-pytest插件生成allure测试报告

一、setup/teardowm,setup_class/teardown_class&#xff08;所有&#xff09; 为什么需要这些功能&#xff1f; 比如&#xff1a;web自动化执行用例之前&#xff0c;请问需要打开浏览器吗&#xff1f;用例执行后需要关闭浏览器吗&#xff1f; 前置后置 二、使用pytest.fixture…

2024.9.23 数据分析

数据脱敏&#xff1a;由于一些数据涉及商业、安全等&#xff0c;不方便公开&#xff0c;所以对隐私数据进行有策略的修改、隐藏等&#xff0c;创建一个与原始数据相似但不含真正敏感细节的数据副本&#xff0c;再由于后续的数据分析、开发测试等操作&#xff08;例如用户的姓名…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Trace调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Trace调测旨在帮助开发者获取内核的运行流程&#xff0c…

大厂面试真题:SpringBoot的核心注解

其实理解一个注解就行了&#xff20;SpringBootApplication&#xff0c;我们的启动类其实就加了这一个 但是这么答也不行&#xff0c;因为面试官要的答案肯定不止这一个 我们打开SpringBootApplication的源码&#xff0c;会发现上面加了一堆的注解 相对而言比较重要是下面三个…