当前位置: 首页 > news >正文

重温设计模式--外观模式

文章目录

  • 外观模式(Facade Pattern)概述
    • 定义
  • 外观模式UML图
    • 作用
  • 外观模式的结构
  • C++ 代码示例1
  • C++代码示例2
  • 总结

外观模式(Facade Pattern)概述

定义

外观模式是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,这个接口使得子系统更容易使用。外观模式隐藏了系统的复杂性,并向客户端提供了一个简单的接口,通过这个接口客户端可以访问系统的功能。

外观模式UML图

在这里插入图片描述

作用

简化了复杂系统的使用。例如,在一个大型软件系统中,可能有多个子系统,每个子系统都有很多接口和操作。对于客户端来说,直接使用这些子系统会很复杂。外观模式通过提供一个统一的接口,让客户端只需要和这个接口交互,而不用关心子系统内部的细节。
降低了系统的耦合度。客户端只依赖于外观类,而不是直接依赖于子系统的众多类。这样,当子系统的内部结构发生变化时,只要外观类的接口不变,客户端就不需要修改代码。

外观模式的结构

外观类(Facade):它知道哪些子系统类负责处理请求,并将客户端的请求代理给适当的子系统对象。外观类是客户端和子系统之间的桥梁。
子系统类(Subsystem Classes):实现系统的具体功能。它们可以被外观类组合和调用,以完成客户端请求的复杂操作。

C++ 代码示例1

假设我们有一个家庭影院系统,它包括一个DVD播放器、一个投影仪和一个音响系统。每个设备都有自己的接口和操作,现在我们使用外观模式来提供一个简单的家庭影院控制接口。

#include<iostream>
#include<string>// 子系统类:DVD播放器
class DVDPlayer
{
public:void on() {std::cout << "DVD Player is on." << std::endl;}void play(){std::cout << "DVD Player is playing." << std::endl;}void off(){std::cout << "DVD Player is off." << std::endl;}
};
// 子系统类:投影仪
class Projector
{
public:void on(){std::cout << "Projector is on." << std::endl;}void project(){std::cout << "Projector is projecting." << std::endl;}void off(){std::cout << "Projector is off." << std::endl;}
};
// 子系统类:音响系统
class SoundSystem
{
public:void on(){std::cout << "Sound System is on." << std::endl;}void setVolume(int volume) {std::cout << "Sound System volume set to " << volume << std::endl;}void off(){std::cout << "Sound System is off." << std::endl;}
};
// 外观类:家庭影院外观
class HomeTheaterFacade
{
private:DVDPlayer dvdPlayer;Projector projector;SoundSystem soundSystem;
public:void watchMovie(){dvdPlayer.on();projector.on();soundSystem.on();dvdPlayer.play();projector.project();soundSystem.setVolume(7);}void endMovie() {dvdPlayer.off();projector.off();soundSystem.off();}
};int main()
{HomeTheaterFacade homeTheater;homeTheater.watchMovie();std::cout << "------------Movie is over.-------------------" << std::endl;homeTheater.endMovie();return 0;
}

在这个示例中,HomeTheaterFacade类是外观类。它包含了DVDPlayer、Projector和SoundSystem这三个子系统类的对象。watchMovie方法提供了一个简单的接口来启动家庭影院系统,让所有设备进入播放电影的状态。endMovie方法则用于关闭所有设备。客户端(main函数)只需要和HomeTheaterFacade类交互,而不用关心每个设备(子系统)的具体操作和状态,这样就简化了家庭影院系统的使用。

C++代码示例2

#include<iostream>
using namespace std;
//外观模式:为子系统提供一个一支的洁面,定义一个
//高层的接口,这一接口使得子系统更加容易使用
class system1
{
public:void method1(){cout<<"method1"<<endl;}
};class system2
{
public:void method2(){cout<<"method2"<<endl;}
};class system3
{
public:void method3(){cout<<"method3"<<endl;}
};
//接口
class facede
{system1 *s1;system2 *s2;system3 *s3;
public://构造函数facede(){s1 = new system1();s2 = new system2();s3 = new system3();}//void methoda(){s1->method1();s2->method2();}//void methodb(){s3->method3();}
};
int main()
{facede *p = new facede();p->methoda();p->methodb();return 0;
}

总结

外观模式本质上应了计算机网络领域的一句名言:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决;
外观模式里的外观类就是一个中间层。

相关文章:

重温设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…...

云原生服务网格Istio实战

基础介绍 1、Istio的定义 Istio 是一个开源服务网格&#xff0c;它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码…...

linux蓝牙模块和手机配对

在 Linux 系统下&#xff0c;将蓝牙模块与手机配对和连接通常涉及以下几个步骤。以下是详细的步骤和命令&#xff0c;帮助你实现蓝牙模块与手机的配对和连接。 1. 确认蓝牙服务已启动 首先&#xff0c;确保蓝牙服务已在 Linux 系统上运行。 systemctl status bluetooth如果服…...

dockerfile文档编写(1):基础命令

目录 Modelscope-agentARGFROMWORKDIRCOPYRUNENVCMD run_loopy Modelscope-agent ARG BASE_IMAGEregistry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.1.2-tf2.14.0-1.12.0FROM $BASE_IMAGEWORKDIR /home/workspaceCOPY . /hom…...

在 Go 中利用 ffmpeg 进行视频和音频处理

在 Go 中利用 ffmpeg 进行视频和音频处理 ffmpegutil 包概述主要功能介绍1. 视频格式转换2. 提取音频3. 获取视频信息4. 创建视频缩略图5. 提取随机帧无线程版本&#xff1a;多线程版本&#xff1a; 总结 ffmpeg 是一款功能强大的多媒体处理工具&#xff0c;支持视频和音频的编…...

【机器学习】探索机器学习与人工智能:驱动未来创新的关键技术

探索机器学习与人工智能&#xff1a;驱动未来创新的关键技术 前言&#xff1a;人工智能的核心技术深度学习&#xff1a;自然语言处理&#xff08;NLP&#xff09;&#xff1a;计算机视觉&#xff1a; 机器学习与人工智能的驱动创新医疗健康领域金融行业智能制造与工业互联网智慧…...

React Refs 完整使用指南

React Refs 完整使用指南 1. Refs 基础用法 1.1 创建和访问 Refs // 类组件中使用 createRef class MyComponent extends React.Component {constructor(props) {super(props);this.myRef React.createRef();}componentDidMount() {// 访问 DOM 节点console.log(this.myRef…...

程控电阻箱应用中需要注意哪些安全事项?

程控电阻箱是一种用于精确控制电路中电流和电压的电子元件&#xff0c;广泛应用于电子实验、测试设备以及精密测量仪器中。在应用程控电阻箱时&#xff0c;为确保安全和设备的正常运行&#xff0c;需要注意以下几个安全事项&#xff1a; 1. 正确连接&#xff1a;确保电阻箱与电…...

C/C++基础知识复习(43)

1) 什么是运算符重载&#xff1f;如何在 C 中进行运算符重载&#xff1f; 运算符重载是指在 C 中为现有的运算符定义新的行为&#xff0c;使得它们能够用于用户定义的数据类型&#xff08;如类或结构体&#xff09;。通过运算符重载&#xff0c;可以让自定义类型像内置数据类型…...

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…...

VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Java开发环境搭建二、VScode下载及安装三、VSCode配置Java环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…...

PHP MySQL 插入多条数据

PHP MySQL 插入多条数据 在Web开发中&#xff0c;PHP和MySQL的组合是非常常见的。PHP是一种服务器端脚本语言&#xff0c;而MySQL是一种流行的数据库管理系统。在许多情况下&#xff0c;我们可能需要一次性向MySQL数据库插入多条数据。这可以通过几种不同的方法实现&#xff0…...

Oracle安装报错:将配置数据上载到资料档案库时出错

环境&#xff1a;联想服务器 windows2022安装Oracle11g 结论&#xff1a;禁用多余网卡先试试&#xff0c;谢谢。 以下是问题描述和处理过程&#xff1a; 网上处理方式: hosts文件添加如下&#xff1a; 关闭防火墙 暂时无法测试通过。 发现ping不是本地状态&#xff0c;而是…...

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能&#xff0c;JS中排序算法的使用详解&#xff08;附实际应用代码&#xff09; 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…...

Deformable DETR:Deformable Transformers for End-to-End Object Detection论文学习

1. 为什么提出了Deformable DETR&#xff1f; 因为DETR本身的计算量大&#xff0c;收敛速度慢。其次是小目标检测效果差。主要原因是Attention模块每次只关注一小部分采样点&#xff0c;导致需要很多轮数才能学习到真实需要关注的目标。 Deformable DETR注意力模块只关注一个…...

机器学习-43-可解释性机器学习库LIME

文章目录 1 LIME1.1 LIME的特点1.2 LIME的步骤2 应用LIME2.1 分类模型2.1.1 创建模型和解释器2.1.2 解释样本2.2 回归模型2.2.1 创建模型和解释器2.2.2 解释样本2.3 文本模型2.3.1 创建模型和解释器2.3.2 解释样本2.4 图像模型2.4.1 创建模型和解释器2.4.2 解释样本3 附录3.1 l…...

【Unity功能集】TextureShop纹理工坊(五)选区

项目源码&#xff1a;在终章发布 索引 选区PS选区选区功能点提炼 TextureShop选区方形区域中间镂空边框的流动虚线SelectedRegion类选择选区更新选区 选区 选区&#xff0c;也既是在当前选中图层中&#xff0c;已选择的编辑区域&#xff0c;我们后续的所有图像编辑操作&#x…...

Spring Cloud OpenFeign快速入门demo

一、应用场景 Spring Cloud OpenFeign 是一个声明式的 HTTP 客户端&#xff0c;旨在简化微服务之间的通信。它使得开发者能够通过简单的接口定义和注解来调用 RESTful API&#xff0c;极大地减少了样板代码。以下是一些典型的应用场景&#xff1a; 微服务间调用&#xff1a;在…...

研发效能DevOps: Vite 使用 Element Plus

目录 一、实验 1.环境 2.初始化前端项目 3.安装 vue-route 4.安装 pinia 5.安装 axios 6.安装 Element Plus 7.gitee创建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、问题 1.README.md 文档推送到gitee未自动换行 2.访问login页面显示空白 3.表单输入账户…...

sfnt-pingpong -测试网络性能和延迟的工具

sfnt-pingpong 是一个用于测试网络性能和延迟的工具&#xff0c;通常用于测量不同网络环境下的数据包传输性能、吞吐量、延迟等指标。 它通常是基于某种网络协议&#xff08;如 TCP&#xff09;执行“ping-pong”式的测试&#xff0c;即客户端和服务器之间相互发送数据包&…...

5步构建OpenVINO Notebooks模型推理服务监控告警系统

5步构建OpenVINO Notebooks模型推理服务监控告警系统 【免费下载链接】openvino_notebooks &#x1f4da; Jupyter notebook tutorials for OpenVINO™ 项目地址: https://gitcode.com/GitHub_Trending/op/openvino_notebooks OpenVINO Notebooks是一套基于Jupyter Note…...

大模型---RAG中的数据处理

目录 一.输入侧 1.纯文本TXT/Markdown 2.HTML/网页 3.Word/PPT 4.Email 5.可选中文本PDF 6.扫描PDF/扫描件/文档图片 7.图片/图表/截图/流程图 8.文档中的表格 9.CSV/XLSX 10.音频 11.视频 12.混合文档 二.输出侧 1.输出侧结构化最常见的四种实现方式 2.常见的…...

SmallThinker-3B-Preview多轮对话效果实测:技术方案讨论与迭代

SmallThinker-3B-Preview多轮对话效果实测&#xff1a;一次关于高并发秒杀系统的技术方案迭代 最近在测试一些轻量级的对话模型&#xff0c;想看看它们在处理复杂技术问题时的实际表现。我手头正好有一个叫SmallThinker-3B-Preview的模型&#xff0c;虽然参数规模不大&#xf…...

Qwen3-ForcedAligner-0.6B歌声处理能力展示:带背景音乐的人声对齐

Qwen3-ForcedAligner-0.6B歌声处理能力展示&#xff1a;带背景音乐的人声对齐 1. 引言 你有没有试过在K歌时&#xff0c;明明觉得自己唱得很准&#xff0c;但录下来一听却发现人声和背景音乐总有点对不上&#xff1f;或者在做视频配音时&#xff0c;费了好大劲调整时间轴&…...

软考高项·信息系统项目管理师 备考攻略(作文专题)

作者经历&#xff1a;改机考后第一年通过。第一次考试仅通过选择题&#xff1b;第二次考试作文未通过&#xff1b;第三次考试&#xff08;机考&#xff09;作文顺利通过&#xff0c;三科全过。欢迎关注, 后续会逐步推出更多备考攻略一、我的三次考试经历 第一次考试&#xff1a…...

手把手教你复现京东H5st参数生成(附Python代码与调试技巧)

手把手教你复现京东H5st参数生成&#xff08;附Python代码与调试技巧&#xff09; 在电商平台的数据交互中&#xff0c;参数加密是保障安全性的重要环节。H5st作为京东H5页面中的关键加密参数&#xff0c;其生成过程涉及多步字符串处理和加密算法组合。本文将带您从零开始&…...

小白程序员也能看懂的大模型内部原理:从加减乘除到Llama 3.1(收藏版)

本文深入浅出地解析了大语言模型&#xff08;LLM&#xff09;的工作原理&#xff0c;从基础的加减乘除运算开始&#xff0c;逐步构建一个生成式AI&#xff0c;并最终理解现代LLM和Transformer架构。文章剥去了机器学习领域的复杂术语&#xff0c;将一切还原为数字&#xff0c;帮…...

即时消息系统:从核心概念到架构演进的深度解析

1. 即时消息系统的核心概念解析 第一次接触即时消息系统开发时&#xff0c;我被各种专业术语搞得晕头转向。直到自己动手实现了一个简易版IM系统&#xff0c;才发现这些概念其实都很接地气。让我们用日常聊天的场景来理解这些专业名词&#xff1a; 用户就是你和你的微信好友&am…...

终极LyricsX歌词配置指南:解锁macOS多源歌词同步的完整方案

终极LyricsX歌词配置指南&#xff1a;解锁macOS多源歌词同步的完整方案 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX作为macOS平台上功能最强大的歌词同步应用&#xff0c;通过…...

omniMath:嵌入式轻量级数学表达式求值与单位转换库

1. omniMath 库深度解析&#xff1a;面向嵌入式系统的轻量级数学表达式求值与单位转换引擎1.1 库定位与工程价值omniMath 是一款专为 Arduino 及兼容平台&#xff08;如 Raspberry Pi Pico、ESP32、STM32duino&#xff09;设计的嵌入式数学计算库。其核心价值不在于替代浮点协处…...