C++实现设计模式---外观模式 (Facade)

外观模式 (Facade)

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


意图

  • 简化复杂子系统的接口。
  • 为客户端提供一个统一的入口,屏蔽子系统的内部细节。

使用场景

  1. 隐藏复杂性

    • 系统的子系统结构复杂,客户端需要简化与子系统的交互。
  2. 提供统一接口

    • 多个子系统有多个接口,外观模式统一了接口,简化了调用。
  3. 降低耦合性

    • 客户端与子系统直接耦合,通过外观模式降低依赖。

参与者角色

  1. 外观 (Facade)

    • 为客户端提供一个简单的接口,隐藏子系统的复杂性。
  2. 子系统 (Subsystem)

    • 子系统的具体实现,包含实际业务逻辑。子系统可能被多个外观类调用。
  3. 客户端 (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. 子系统类

  • DVDPlayerSoundSystemLighting 是子系统的具体实现,提供了功能性接口。
  • 每个子系统类都独立完成自己的职责。

2. 外观类

  • HomeTheaterFacade 是外观类,封装了多个子系统的操作。
  • 提供了简化的接口 watchMovieendMovie,让客户端能够轻松调用复杂子系统。

3. 客户端

  • 客户端直接调用外观类的方法,而不需要关心子系统的内部逻辑。

优缺点

优点

  1. 简化接口

    • 客户端通过外观类与子系统交互,降低了使用难度。
  2. 松散耦合

    • 客户端与子系统之间的耦合性降低,通过外观类隔离依赖。
  3. 更好的划分子系统

    • 外观类将子系统的实现细节隐藏起来,让系统更清晰。

缺点

  1. 增加额外类

    • 引入外观类增加了系统的类数量。
  2. 过度设计

    • 如果子系统本身不复杂,引入外观类可能是多余的。

适用场景

  1. 子系统复杂性较高

    • 客户端需要调用多个子系统的接口,外观模式可以简化调用流程。
  2. 解耦客户端和子系统

    • 客户端通过外观类与子系统交互,降低了直接依赖。
  3. 为遗留代码提供兼容接口

    • 通过外观模式,可以为复杂的旧系统提供一个简单的接口。

总结

外观模式通过为子系统提供一个统一的接口,简化了客户端与子系统的交互。它适用于需要简化复杂子系统或提供统一访问方式的场景,是一种非常实用的设计模式。

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

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

相关文章

STM32网络通讯之CubeMX实现LWIP项目设计(十五)

STM32F407 系列文章 - ETH-LWIP-CubeMX&#xff08;十五&#xff09; 目录 前言 一、软件设计 二、CubeMX实现 1.配置前准备 2.CubeMX配置 1.ETH模块配置 2.时钟模块配置 3.中断模块配置 4.RCC及SYS配置 5.LWIP模块配置 3.生成代码 1.main文件 2.用户层源文件 3.…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout&#xff08;检出&#xff09;到 Pycharm中 2、推送…

【Qt】03-页面切换

前言一、按键实现界面切换1.1 创建新的类文件1.1.1 创建1.1.2 细节选择 1.2 代码以及需要注意的点mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h 1.3 结果展示 二、signal关键字2.1 代码以及解释mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h解释 2.2 现象 三…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…

02JavaWeb——JavaScript-Vue(项目实战)

一、JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习 JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过JS/js效果演示提供资料进行效果演…

【java】java入门

盘符名称冒号---------盘符切换 dir---------------查看当前路径下的内容 cd目录--------进入单级目录 cd..----------回退到上一级目录 cd \----------回退到盘符目录 cls----------清屏 exit 为什么要配环境变量&#xff1f; 在任意的目录下都可以打开指定的软件。把软件的路…

利用爬虫获取某学习软件的考试题库(带源码)

首先要重新进行账号的登陆用来获取cookie 按下F12在控制台输入&#xff1a; // 获取当前页面的 cookies var cookies document.cookie.split(";");// 创建一个数组来存储 cookies 对象 var cookieArray [];// 遍历每个 cookie 并将其转换为对象 cookies.forEach(f…

【C++篇】红黑树的实现

目录 前言&#xff1a; 一&#xff0c;红黑树的概念 1.1&#xff0c;红黑树的规则 1.2&#xff0c;红黑树的最长路径 1.3&#xff0c;红黑树的效率分析 二&#xff0c;红黑树的实现 2.1&#xff0c;红黑树的结构 2.2&#xff0c;红黑树的插入 2.2.1&#xff0c;大致过程…

Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件

通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码&#xff0c;将远程的6006端口代理到本地 在服务器终端&#xff0c;激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…

镭速大文件传输视频文件预览实现原理

镭速可以支持视频预览&#xff0c;在测试过程中需要大量不同格式的视频&#xff0c;如果直接去找各种格式的视频不太现实&#xff0c;所以就会用到一个视频格式转换的工具ffmpeg&#xff0c;本文将介绍ffmpeg的基本使用方法。FFmpeg 是一个免费开源的音视频处理工具&#xff0c…

达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介

1、DMSQL程序简介 DMSQL程序是达梦数据库对标准SQL语言的扩展&#xff0c;是一种过程化SQL语言。在DMSQL程序中&#xff0c;包括一整套数据类型、条件结构、循环结构和异常处理结构等&#xff0c;DMSQL程序中可以执行SQL语句&#xff0c;SQL语句中也可以使用DMSQL函数。 DMSQ…

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中&#xff0c;字体的选择和使用对最终作品的质量有着重要影响。然而&#xff0c;有时我们可能会遇到包含未知字体的PDF文件&#xff0c;这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题&#xff0c;让我们能够更好地处理这些文件。…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

thinkphp6 + redis实现大数据导出excel超时或内存溢出问题解决方案

redis下载安装&#xff08;window版本&#xff09; 参考地址&#xff1a;https://blog.csdn.net/Ci1693840306/article/details/144214215 php安装redis扩展 参考链接&#xff1a;https://blog.csdn.net/jianchenn/article/details/106144313 解决思路&#xff1a;&#xff0…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…

学习threejs,使用OrbitControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.OrbitControls 相机控…

Linux:认识Shell、Linux用户和权限

谈起Linux&#xff0c;一般是在说区别于Windows的Linux操作系统&#xff0c;而Linux刚开始用来指Linux内核。值得一提的是&#xff0c;安卓底层也是Linux内核&#xff0c;而安卓系统又是区别于Linux的操作系统。 目录 一、Shell 为什么会有Shell 什么是Shell Shell相关具体…

HCIP-VLAN-hybrid接口+DHCP实验

1.拓扑及实验需求 2.需求分析 需要用到的技术 1、虚拟局域网&#xff08;VLAN&#xff09; 2、动态主机配置协议&#xff08;DHCP&#xff09; 3、单臂路由 首先先完成交换部分&#xff0c;创建对应的vlan将PC1与PC3划入vlan2且接口类型为access&#xff0c;而以外的PC都划…