C++实现设计模式---外观模式 (Facade)
外观模式 (Facade)
外观模式 是一种结构型设计模式,为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口,使得子系统更容易使用。
意图
- 简化复杂子系统的接口。
- 为客户端提供一个统一的入口,屏蔽子系统的内部细节。
使用场景
-
隐藏复杂性:
- 系统的子系统结构复杂,客户端需要简化与子系统的交互。
-
提供统一接口:
- 多个子系统有多个接口,外观模式统一了接口,简化了调用。
-
降低耦合性:
- 客户端与子系统直接耦合,通过外观模式降低依赖。
参与者角色
-
外观 (Facade)
- 为客户端提供一个简单的接口,隐藏子系统的复杂性。
-
子系统 (Subsystem)
- 子系统的具体实现,包含实际业务逻辑。子系统可能被多个外观类调用。
-
客户端 (Client)
- 通过外观类与子系统交互,无需直接访问子系统。
示例代码
以下代码展示了如何使用外观模式简化对一个家庭影院子系统的操作。
#include <iostream>
#include <string>// 子系统类:DVD播放器
class DVDPlayer {
public:void on() {std::cout << "DVD Player is ON." << std::endl;}void off() {std::cout << "DVD Player is OFF." << std::endl;}void play(const std::string& movie) {std::cout << "Playing movie: " << movie << std::endl;}
};// 子系统类:音响
class SoundSystem {
public:void on() {std::cout << "Sound System is ON." << std::endl;}void off() {std::cout << "Sound System is OFF." << std::endl;}void setVolume(int level) {std::cout << "Setting volume to " << level << std::endl;}
};// 子系统类:灯光
class Lighting {
public:void dim() {std::cout << "Lights are dimmed." << std::endl;}void on() {std::cout << "Lights are ON." << std::endl;}
};// 外观类:家庭影院外观
class HomeTheaterFacade {
private:DVDPlayer* dvdPlayer;SoundSystem* soundSystem;Lighting* lighting;public:HomeTheaterFacade(DVDPlayer* dvd, SoundSystem* sound, Lighting* light): dvdPlayer(dvd), soundSystem(sound), lighting(light) {}void watchMovie(const std::string& movie) {std::cout << "Get ready to watch a movie..." << std::endl;lighting->dim();soundSystem->on();soundSystem->setVolume(5);dvdPlayer->on();dvdPlayer->play(movie);}void endMovie() {std::cout << "Shutting down the home theater..." << std::endl;dvdPlayer->off();soundSystem->off();lighting->on();}
};// 客户端代码
int main() {// 创建子系统对象DVDPlayer dvdPlayer;SoundSystem soundSystem;Lighting lighting;// 创建外观对象HomeTheaterFacade homeTheater(&dvdPlayer, &soundSystem, &lighting);// 使用外观模式homeTheater.watchMovie("Inception");homeTheater.endMovie();return 0;
}
代码解析
1. 子系统类
DVDPlayer、SoundSystem和Lighting是子系统的具体实现,提供了功能性接口。- 每个子系统类都独立完成自己的职责。
2. 外观类
HomeTheaterFacade是外观类,封装了多个子系统的操作。- 提供了简化的接口
watchMovie和endMovie,让客户端能够轻松调用复杂子系统。
3. 客户端
- 客户端直接调用外观类的方法,而不需要关心子系统的内部逻辑。
优缺点
优点
-
简化接口:
- 客户端通过外观类与子系统交互,降低了使用难度。
-
松散耦合:
- 客户端与子系统之间的耦合性降低,通过外观类隔离依赖。
-
更好的划分子系统:
- 外观类将子系统的实现细节隐藏起来,让系统更清晰。
缺点
-
增加额外类:
- 引入外观类增加了系统的类数量。
-
过度设计:
- 如果子系统本身不复杂,引入外观类可能是多余的。
适用场景
-
子系统复杂性较高:
- 客户端需要调用多个子系统的接口,外观模式可以简化调用流程。
-
解耦客户端和子系统:
- 客户端通过外观类与子系统交互,降低了直接依赖。
-
为遗留代码提供兼容接口:
- 通过外观模式,可以为复杂的旧系统提供一个简单的接口。
总结
外观模式通过为子系统提供一个统一的接口,简化了客户端与子系统的交互。它适用于需要简化复杂子系统或提供统一访问方式的场景,是一种非常实用的设计模式。
相关文章:
C++实现设计模式---外观模式 (Facade)
外观模式 (Facade) 外观模式 是一种结构型设计模式,为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口,使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口,屏蔽子系统的内部细节。 …...
仿射密码实验——Python实现(完整解析版)
文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.py 前言 实验目的 1)初步了解古典密码 2)掌握仿射密码的实现 实验方法 根据下图仿射密码(变换…...
【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)
按钮控件继承自抽象类QAbstractButton。 抽象类不允许实例化对象,内部定义纯虚函数。只能通过子类继承,重写纯虚函数的方式使用。 1. QPushButton 1.1 QAbstractButton中和QPushButton相关的属性 text按钮显示文本icon按钮图标iconSize按钮图标尺寸s…...
Amazon Relational Database Service (RDS)
Amazon Relational Database Service (RDS) 是 AWS 提供的一项完全托管的关系数据库服务,旨在简化部署、管理和扩展关系型数据库应用程序。通过 RDS,用户可以使用多种流行的关系数据库引擎,如 MySQL、PostgreSQL、MariaDB、Oracle 和 Microso…...
linux分配磁盘空间命令
使用命令lsblk查询linux磁盘空间时,发现空间并没有被分配完 如图,600G,但实际分配了一共199G,剩余500G,我们需要通过命令进行剩余存储的分配。 思路:创建新的分区->更新内核分区表->初始化新分区作…...
21_Spring Boot缓存注解介绍
前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…...
【linux】grep、awk、sed实战练习(1)-template
一、grep常见用法 1.1.从文件中查找关键字符串 # 比如:查找/etc/nginx/nginx.conf文件包含"listen"的行 [rootecs_server test]# grep "listen" -n /etc/nginx/nginx.conf 52: listen 8088; 87: listen 8096; # 比如:查…...
UDP报文格式
UDP是传输层的一个重要协议,他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式: 1,报头 UDP的报头长度位8个字节,包含源端口、目的端口、长度和校验和,其中每个属性均为两个字节。报头格式为二…...
联想Android面试题及参考答案
请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...
Android CustomTextField
在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…...
网络设备安全保证计划 (NESAS) - 供应商视角 笔记
NESAS 对供应商的意义 提升产品安全性: NESAS 为供应商提供了一套全球认可的安全评估标准,帮助其识别和解决产品中的安全漏洞。通过 NESAS 评估,供应商可以证明其产品符合行业最高安全标准,增强客户信任。增强市场竞争力: 通过 NESAS 认证的…...
强化学习-蒙特卡洛方法
强化学习-数学理论 强化学习-基本概念强化学习-贝尔曼公式强化学习-贝尔曼最优公式强化学习-值迭代与策略迭代强化学习-蒙特卡洛方法 文章目录 强化学习-数学理论一、蒙特卡洛方法理论(Monte Carlo, MC)二、MC Basic2.1 算法拆解2.2 MC Basic算法 三、MC Exploring Starts3.1 …...
IIO(Industrial I/O)驱动介绍
文章目录 IIO(Industrial I/O)驱动是Linux内核中用于工业I/O设备的子系统,主要用于处理传感器数据采集和转换。以下是其关键点: 功能 数据采集:从传感器读取数据。数据处理:对原始数据进行滤波、校准等操作…...
画流程图 代码生成流程图 流程图自动运行
一:在线平台 典藏 drawio:完全免费;可拆入代码生成;使用方法 Kimi drawio生成流程图:Kimi里面生成Mermaid格式——>生成代码并复制——>进入drawio里面点插入"号"——>高级——>Mermaid——…...
Maven 配置本地仓库
步骤 1:修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件,找到 <localRepository> 标签。如果没有该标…...
计算机网络常见协议
目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS(SSL/TLS加密) HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…...
SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现
SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现 目录 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长…...
基于Java+SpringBoot+Vue的前后端分离的体质测试数据分析及可视化设计
基于JavaSpringBootVue的前后端分离的体质测试数据分析及可视化设计 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码…...
Ansible实战:如何正确选择 command 和shell模块?
在使用Ansible进行自动化运维时,command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似,但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率,还能帮助我们规避一些潜在的风险。在这篇文章…...
机器学习:监督学习与非监督学习
监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
