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

文章目录

  • 外观模式(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;
}

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github

经过近3个月的迭代开发&#xff0c;新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了&#xff0c;最新的EasyGBD支持了国标GB28181-2022版&#xff0c;还支持了语音对讲、位置上报、本地录像等功能&#xff0c;比原有GB28181-2016版的EasyGBD更加高效、…

element-puls封装表单验证

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在做项目中会有一些简单的表单非空验证&#xff0c;这些验证比较简单&#xff0c;就是代码看着有点多&#xff0c;做起来浪费时间&#xff0c;所以我们可以将这个方法封装起来&#xff0c;然后挂载全…

Unity命令行传递自定义参数 命令行打包

命令行参数增加位置 -executeMethod 某脚本.某方法 参数1 参数2 参数3 ... 例如执行EditorTest.GetCommandLineArgs方法 增加两个命令行参数 Version=125 CDNVersion=100 -executeMethod EditorTest.GetCommandLineArgs Version=125 CDNVersion=100 Unity测试脚本 需要放在…

【Java基础面试题033】Java泛型的作用是什么?

Java的基础语法可以看尚硅谷的这个PDF&#xff1a;尚硅谷JavaSE基础/《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java泛型的作用是通过在编译时检查类型安全&#xff0c;允许程序员编写更通用和…

Flutter环境搭建

1.Flutter 简介 1.1 Flutter 是什么 &#xff1f; Flutter 是一个 UI SDK&#xff08;Software Development Kit&#xff09;跨平台解决方案&#xff1a;可以实现一套代码发布移动端&#xff08;iOS、Android、HarmonyOS&#xff09;、Web端、桌面端目前很多公司都在用它&…

COMSOL with Matlab

文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…

AlipayHK支付宝HK接入-商户收款(PHP)

一打开支付宝国际版 二、点开商户服务 三、下载源码

设计模式之 abstract factory

适用场景 一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库&#xff0c;而只想显示它们的接口而不是实现时 架构演示 首先client这个东西可以接触到…

华为IPD流程6大阶段370个流程活动详解_第一阶段:概念阶段 — 81个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…

每天40分玩转Django:Django部署

Django部署 一、今日学习内容概述 学习模块重要程度主要内容生产环境配置⭐⭐⭐⭐⭐settings配置、环境变量WSGI服务器⭐⭐⭐⭐⭐Gunicorn配置、性能优化Nginx配置⭐⭐⭐⭐反向代理、静态文件安全设置⭐⭐⭐⭐⭐SSL证书、安全选项 二、生产环境配置 2.1 项目结构调整 mypr…

主要是使用#includenlohmannjson.hpp时显示找不到文件,但是我文件已正确导入visual studio配置,也保证文件正确存在

问题&#xff1a; 主要是在项目配置中包括了C/C配置中文件位置&#xff0c;但是没有把nlohmann上一级的目录包括进去&#xff0c;导致#include"nlohmann/json.hpp"找不到文件位置 解决&#xff1a; 加上上一级目录到附加包含目录 596513661)] 总结&#xff1a; 找不…

tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录

目录 tslib的简介tslib的源码和make及make install后得到的文件下载tslib的主要功能tslib的工作原理tslib的核心组成部分tslib的框架和核心函数分析tslib的框架tslib的核心函数ts_setup()的分析(对如何获取设备名和数据处理流程的分析)函数ts_setup()自身的主要代码ts_setup()对…

Unity DOTS中的share component

Unity DOTS中的share component 内存管理创建流程修改流程销毁流程Reference share component是DOTS中一类比较特殊的component&#xff0c;顾名思义&#xff0c;它是全局共享的component&#xff0c;所有具有相同component值的entity&#xff0c;共享一个component&#xff0c…

EfficienetAD异常值检测之瓷砖表面缺陷检测(免费下载测试数据集和模型)

背景 当今制造业蓬勃发展&#xff0c;产品质量把控至关重要。从精密电子元件到大型工业板材&#xff0c;表面缺陷哪怕细微&#xff0c;都可能引发性能故障或外观瑕疵。人工目视检测耗时费力且易漏检&#xff0c;已无法适应高速生产线节奏。在此背景下&#xff0c;表面缺陷异常…

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

vscode 快速切换cangjie版本

前言 目前阶段cangjie经常更新&#xff0c;这就导致我们可能会需要经常在不同的版本之间切换。 在参加训练营时从张老师那学到了如何使用 vscode 的配置文件来快速进行cangjie版本的切换。 推荐一下张老师的兴趣组 SIGCANGJIE / 仓颉兴趣组 这里以 windows 下&#xff0c;配置…

RCE总结

文章目录 常见漏洞执行函数&#xff1a;1.系统命令执行函数2.代码执行函数 命令拼接符读取文件命令绕过&#xff1a;空格过滤绕过关键字绕过长度过滤绕过无参数命令执行绕过无字母数字绕过利用%0A截断利用回溯绕过利用create_function()代码注入无回显RCE1.反弹shell2.dnslog外…

springmvc的拦截器,全局异常处理和文件上传

拦截器: 拦截不符合规则的&#xff0c;放行符合规则的。 等价于过滤器。 拦截器只拦截controller层API接口。 如何定义拦截器。 定义一个类并实现拦截器接口 public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest reque…

前端知识补充—HTML

1. HTML 1.1 什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔ 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它的学者所加的评注、补充或脚注等等 标记语⾔: 由标签构成的语⾔…

vscode 使用说明

文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff…