外观设计模式学习

1.介绍

外观模式(Facade Pattern) 是一种结构型设计模式,通过提供一个统一的接口,用于访问子系统中的一组接口,从而简化客户端与复杂系统之间的交互。它隐藏了系统的复杂性,使得客户端只需与一个简单的接口交互,而无需了解内部的实现细节。

核心思想

  • 简化接口:外观模式通过创建一个高级接口,屏蔽了子系统的复杂性。
  • 解耦:客户端无需直接与子系统的复杂接口交互,减少了系统之间的依赖性。

模式结构

  1. Facade(外观类):提供一个统一的接口,用来访问子系统中的功能。
  2. Subsystem(子系统):实现子系统的实际功能,对外隐藏其内部细节。
  3. Client(客户端):通过外观类与子系统交互。

外观模式的缺点

  1. 可能过多依赖:如果外观类变得过于复杂,可能会导致其自身成为一个“大而全”的类。
  2. 隐藏细节:外观模式可能会掩盖子系统的一些细节,从而限制了灵活性。

2.示例

假设我们要实现一个家庭影院系统,它包含多个子系统,如电视、音响、播放器等。客户端希望通过一个统一的接口来控制整个系统。

#include <iostream>
#include <string>// 子系统1:电视
class Television {
public:void turnOn() { std::cout << "Television is ON\n"; }void turnOff() { std::cout << "Television is OFF\n"; }
};// 子系统2:音响
class SoundSystem {
public:void turnOn() { std::cout << "SoundSystem is ON\n"; }void turnOff() { std::cout << "SoundSystem is OFF\n"; }void setVolume(int level) { std::cout << "SoundSystem volume set to " << level << "\n"; }
};// 子系统3:播放器
class MediaPlayer {
public:void play(const std::string& movie) { std::cout << "Playing movie: " << movie << "\n"; }void stop() { std::cout << "Stopping the movie\n"; }
};// 外观类
class HomeTheaterFacade {
private:Television tv; // 包含了其他类对象SoundSystem soundSystem;MediaPlayer mediaPlayer;public:void watchMovie(const std::string& movie) {std::cout << "Get ready to watch a movie...\n";tv.turnOn();soundSystem.turnOn();soundSystem.setVolume(50);mediaPlayer.play(movie);}// 直接调用其他接口类void endMovie() {std::cout << "Shutting down the home theater...\n";mediaPlayer.stop();soundSystem.turnOff();tv.turnOff();}
};// 客户端代码
int main() {HomeTheaterFacade homeTheater;homeTheater.watchMovie("Inception");homeTheater.endMovie();return 0;
}

3.抽象外观类

当增加或移除子系统时需要修改外观类,这违背了“开闭原则”。将外观类与具体的子系统解耦,通过依赖注入动态管理子系统。这种方式可以在运行时动态增加或移除子系统,而无需修改外观类的代码。

#include <iostream>
#include <memory>
#include <unordered_map>
#include <string>// 子系统接口
class Subsystem {
public:virtual void execute() = 0;virtual ~Subsystem() = default;
};// 具体子系统1
class SubsystemA : public Subsystem {
public:void execute() override { std::cout << "SubsystemA executed.\n"; }
};// 具体子系统2
class SubsystemB : public Subsystem {
public:void execute() override { std::cout << "SubsystemB executed.\n"; }
};// 外观类
class Facade {
private:// 依赖抽象的子系统类std::unordered_map<std::string, std::shared_ptr<Subsystem>> subsystems;public:void addSubsystem(const std::string& name, std::shared_ptr<Subsystem> subsystem) {subsystems[name] = subsystem;}void removeSubsystem(const std::string& name) {subsystems.erase(name);}void executeSubsystem(const std::string& name) {if (subsystems.count(name)) {subsystems[name]->execute();} else {std::cout << "Subsystem " << name << " not found.\n";}}
};// 客户端代码
int main() {Facade facade;// 动态添加子系统facade.addSubsystem("A", std::make_shared<SubsystemA>());facade.addSubsystem("B", std::make_shared<SubsystemB>());// 调用子系统facade.executeSubsystem("A");facade.executeSubsystem("B");// 动态移除子系统facade.removeSubsystem("A");facade.executeSubsystem("A");return 0;
}

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

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

相关文章

基于单片机的数字气压计设计

摘要:在嵌入式技术快速发展过程中&#xff0c;智能测量仪器被广泛应用于工业生产以及人们日常生活领域。数字气压计在实际应用中&#xff0c;利用气压传感器检测环境中的压力大小&#xff0c;便于实现对设备进行智能化的控制操作。数字气压计在气象监测、矿产开采、科学实验等环…

嵌入式软件C语言面试常见问题及答案解析(三)

嵌入式软件C语言面试常见问题及答案解析(三) 上一篇已经足够长了,再长也就有点不礼貌了,所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者代码均代表个人的理解,如有不合理或者错误的地方,欢迎大家批评指正。 本文中题目列表 1. 编码实现子串定…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

ROS通信编程——服务通信

前言 学完了话题通信其实操作流程基本都已经很熟悉了&#xff0c;因此服务通讯的学习就会流畅许多。 服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收…

零基础微信小程序开发——全局配置之tabBar(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

2024年12月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同&#xff0c;作者已于2024年12月15日又更新了一波题库&#xff0c;题库正确率99%&#xff01; 新版…

【网络协议】IPv4 地址分配 - 第二部分

前言 在第 1 部分中&#xff0c;我们学习了 IPv4 地址的分配方式&#xff0c;了解了各种类型的 IPv4 地址&#xff0c;并进行了基础的子网划分&#xff08;Subnetting&#xff09;。在第 2 部分中&#xff0c;我们将继续学习子网划分&#xff0c;并引入一些新的概念。 【网络…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

7z 安装与使用指南

文章目录 1. 安装 7z1.1 在 Linux 上安装 7z对于 Debian/Ubuntu 系统&#xff1a;对于 CentOS/RHEL 系统&#xff1a;对于 Fedora 系统&#xff1a;对于 Arch Linux 系统&#xff1a; 1.2 在 Windows 上安装 7z 2. 使用 7z 进行压缩和解压2.1 压缩文件示例&#xff1a;压缩一个…

scanf:数据之舟的摆渡人,静卧输入港湾的诗意守候

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节我们主要来学习scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和赋值…

【ROS2】Arduino系列之电机驱动实现

内容学自&#xff1a;赵虚左老师。学后总结&#xff01; 实现机器人移动的一种策略是&#xff1a;控制系统会先发布预期的车辆速度信息&#xff0c;然后驱动系统订阅到该信息&#xff0c;不断调整电机转速直至达到预期速度&#xff0c;调速过程中还需要时时获取实际速度并反馈…

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1&#xff1a;jenkins中如何配置npm的源 提问2&#xff1a;jenkins pipeline 类型为pipeline script from SCM时&#xff0c;如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…

常见的开源网络操作系统

常见的开源网络操作系统有很多,它们通常用于路由器、交换机、网络设备和服务器等场景,具有灵活、可定制、易于扩展的特点。以下是一些常见的开源网络操作系统: OpenWRT 用途:主要用于路由器、无线接入点和网络设备。提供了广泛的定制选项和高级功能,如防火墙配置、VPN 支持…

Java 日期时间格式化标准

文章目录 Java日期时间格式化符号ISO 8601中的日期时间ISO 8601标准的定义ISO 8601日期时间格式 周数年份ISO 8601中的周数年份Java中的周数年份 Java跨年日期格式化BUG注意事项 Java日期时间格式化符号 JDK官网截图&#xff1a; 格式化符号梳理&#xff1a; 符号描述符号用…

【2024华为OD-E卷-200分-数值同化】(题目+思路+JavaC++Python解析)

题目描述 题目名称&#xff1a;数值同化 题目背景&#xff1a; 在一个数值同化过程中&#xff0c;你需要将一组数值进行特定的处理&#xff0c;使得它们能够“同化”到一个目标值附近。具体做法是&#xff0c;给定一个数组 nums 和一个目标值 target&#xff0c;你需要对数组…

【HUAWEI】HCIP-AI-MindSpore Developer V1.0 | 结课测试

目录 一 单选 二 多选 三 判断 四 填空 一 单选 1 一张图片在存放过程中出现了很多小的噪声&#xff0c;或白或黑&#xff0c;对其扫描进行以下哪一个操作的去噪效果最好&#xff1f; A.均值滤波 B.中值滤波 C.高斯滤波 D.拉普拉斯滤波 2 以下哪个方法中使用了掩码语…

ESP32-S3模组上实现低功耗(6)

接前一篇文章:ESP32-S3模组上实现低功耗(5) 本文内容参考: 系统低功耗模式介绍 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 电源管理 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档

chrome浏览器的更新提示弹窗无法更新Chrome解决方法

使用组策略编辑器 此方法适用于 Windows 系统且系统为专业版及以上版本&#xff0c;家庭版系统没有组策略功能。 按下Win R键&#xff0c;打开 “运行” 对话框&#xff0c;输入gpedit.msc并回车&#xff0c;打开组策略编辑器。 在组策略编辑器中&#xff0c;依次展开 “计算机…

高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解

在高山旅游景区&#xff0c;传统的物资运输方式往往面临人力成本高昂、效率低下等问题&#xff0c;而无人机技术的引入为这一难题提供了新的解决方案。以下是对无人机从山下到山上进行物资吊运技术的详细解析&#xff1a; 一、无人机物资吊运技术的优势 1. 降低人力成本&#…

读博生涯记录2 __ 2025.1.8 --- 关于博一上学期的一些经历和感受

时间过得好快&#xff0c;2024年8月底入学至今都快半年了。学校已经放寒假了&#xff0c;我也计划过多几天就回去&#xff0c;在这个太阳早已落山的午后&#xff0c;在这工位区的一隅&#xff0c;想着记录一下本学期我的一些经历和感受。 专业上&#xff1a;本学期我给自己的规…