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

文章目录

  • 外观模式(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/942271.html

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

相关文章

【恶意软件检测】一种基于API语义提取的Android恶意软件检测方法(期刊等级:CCF-B、Q2)

一种基于API语义提取的Android恶意软件检测方法 A novel Android malware detection method with API semantics extraction 摘要 由于Android框架和恶意软件的持续演变&#xff0c;使用过时应用程序训练的传统恶意软件检测方法在有效识别复杂演化的恶意软件方面已显不足。为…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

RT-DETR学习笔记(2)

七、IOU-aware query selection 下图是原始DETR。content query 是初始化为0的label embedding, position query 是通过nn.Embedding初始化的一个嵌入矩阵&#xff0c;这两部分没有任何的先验信息&#xff0c;导致DETR的收敛慢。 RT-DETR则提出要给这两部分&#xff08;conten…

fpgafor循环语句使用

genvar i;//循环变量名称 generate for(i0;i<4;ii1)begin:tx//自己定义名称 //循环内容 end endgenerate12位的16进制乘以4就是48位位宽的2进制 因为 222*2(2^4)16

62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)

项目介绍 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进…

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

路由器转发数据报的封装过程

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器转发数据的封装过程 路由器转发数据的封…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module)&#xff0c;它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode&#xff0c;它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API&#xff0c;比如最常…

虚拟机桥接模式

主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单&#xff1a;编辑>虚拟机网络编辑&#xff0c;点击“更改设置”&#xff0c;可以看到三个网卡&#xff0c;这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0&#xff0c;如果没看到这个网卡&…

重温设计模式--享元模式

文章目录 享元模式&#xff08;Flyweight Pattern&#xff09;概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式&#xff08;Flyweight Pattern&#xff09;概述 定义&#xff1a; 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…

单机游戏《野狗子》游戏运行时提示dbghelp.dll缺失是什么原因?dbghelp.dll缺失要怎么解决?

《野狗子》游戏运行时提示dbghelp.dll缺失&#xff1a;原因与解决方案 在畅游《野狗子》这款引人入胜的游戏世界时&#xff0c;突然遭遇“dbghelp.dll缺失”的错误提示&#xff0c;无疑会给玩家的探险之旅蒙上一层阴影。作为一名深耕软件开发领域的从业者&#xff0c;我深知此…

CASA模型相关遥感数据及MODIS NDVI、FPAR遥感产品数据时序重建

植被作为陆地生态系统的重要组成部分对于生态环境功能的维持具有关键作用。植被净初级生产力&#xff08;Net Primary Productivity, NPP&#xff09;是指单位面积上绿色植被在单位时间内由光合作用生产的有机质总量扣除自养呼吸的剩余部分。植被NPP是表征陆地生态系统功能及可…

如何在谷歌浏览器中设置桌面快捷方式

在日常使用电脑时&#xff0c;反复在浏览器中输入经常访问的网址不仅耗时&#xff0c;而且降低了工作效率。为了解决这一问题&#xff0c;我们可以通过在主屏幕上创建谷歌浏览器的快捷方式来简化操作。本文将详细介绍如何在Windows和Mac系统中实现这一功能。 一、步骤概述 1. …

SYD881X RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟

RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟 这里RTC做了两个定时器一个是12秒,一个是185秒: #define RTCEVT_NUM ((uint8_t) 0x02)//当前定时器事件数#define RTCEVT_12S ((uint32_t) 0x0000002)//定时器1s事件 /*整分钟定时器事件&#xff0c;因为其余的…

UE5喷涂功能

许多FPS/TPS 游戏都有喷涂、涂鸦功能 其实原理很简单&#xff0c;就是利用了延迟贴花实现的 我们从网上随便找一张图 创建一个材质&#xff0c;材质域选择延迟贴花 混合模式选择半透明&#xff0c;自发光强度可以看感觉调整 材质做好之后编译保存&#xff0c;新建一个Actor…

攻防世界 ics-06

开启场景 可以交互的按钮不是很多&#xff0c;没有什么有用信息&#xff0c;查看页面源代码找到了index.php &#xff0c;后面跟着“报表中心” 传参访问 /index.php 看到了参数 id1&#xff0c;用 burp 抓包爆破&#xff08;这里应该不是 sql 注入&#xff09; 2333 的长度与众…

Flutter 异步编程简述

1、isolate 机制 1.1 基本使用 Dart 是基于单线程模型的语言。但是在开发当中我们经常会进行耗时操作比如网络请求&#xff0c;这种耗时操作会堵塞我们的代码。因此 Dart 也有并发机制 —— isolate。APP 的启动入口main函数就是一个类似 Android 主线程的一个主 isolate。与…

RT-DETR融合[CVPR2023]FFTformer中的FSAS模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《Efficient Frequency Domain-based Transformers for High-Quality Image Deblurring》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2211.12250 代码链接&…

新手SEO指南如何快速入门与提升网站排名

内容概要 搜索引擎优化&#xff08;SEO&#xff09;是提高网站可见度和排名的重要手段&#xff0c;尤其对新手来说&#xff0c;掌握其基本概念和实用技巧至关重要。本文将针对新手提供一系列的指导&#xff0c;帮助你快速入门并逐步提升网站排名。 首先&#xff0c;了解SEO的…

【终端工具】FinalShell v4.5.12 官方版

1.下载地址 【终端工具】FinalShell v4.5.12 官方版 2.简介 FinalShell是一款免费的跨平台远程管理工具&#xff0c;专为开发者和运维人员设计。它支持通过 SSH、SFTP 等方式连接到 Linux 和 Windows 服务器&#xff0c;提供类似于终端的操作界面。除了常规的远程登录功能&a…