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

门面模式-C++实现

门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。通俗的讲,门面模式就像一个大门,为子系统提供一个进入点。通过门面对象,客户端可以更方便地使用子系统中的功能,同时这个门面对象也起到了隐藏子系统的复杂性、提高系统的可维护性等作用。

在门面模式中,门面对象将客户端与内部子系统分离开来,让客户端只需要与门面对象交互,而不用直接与子系统的组件交互。这种解耦可以让子系统更独立,让系统更灵活,同时也让客户端更容易使用和维护。

门面模式适用于当系统中存在多个复杂的子系统时,或需要为客户端提供简化接口时。它可以减少系统的耦合度,简化系统的接口,同时也可以提高系统的扩展性和可维护性。

举例:

假设我们有一个音乐播放器系统,其中包含多个复杂的子系统:音频解码、音频缓存、音量控制等。为了简化客户端与子系统的交互,我们可以使用门面模式设计一个音乐播放器门面类,如下所示:

#pragma once

#include <iostream>
#include <memory>

// 音频解码系统
class AudioCodec
{
public:

	void LoadAudioFile(const std::string& _filePath)
	{
		std::cout << "开始音频解码" << std::endl;

		codecRes_ = "解码结果";
	}

	// 获取音频解码结果
	std::string GetCodecResult()
	{
		return codecRes_;
	}

private:

	// 音频解码结果
	std::string codecRes_;
};

// 音量控制
class VolumeControl
{
public:

	// 设置音量
	void SetVolume(const int& _volume)
	{
		std::cout << "音量控制" << std::endl;
		volume_ = _volume;
	}

	// 获取音量
	int GetVolume()
	{
		return volume_;
	}

private:

	// 音量
	int volume_;
};

// 音频缓存系统
class AudioCache
{
public:

	// 根据音频解码结果进行缓存
	void CreateCache(const std::string& _codecRes)
	{
		if (_codecRes.empty())
			return;

		std::cout << "开始音频缓存" << std::endl;
	}

	// 播放音乐
	void Play()
	{
		std::cout << "播放音乐" << std::endl;
	}
};

class MusicPlayerFacade
{
public:

	MusicPlayerFacade()
	{
		audioCache_ = std::make_shared<AudioCache>();
		audioCodec_ = std::make_shared<AudioCodec>();
		volumeControl_ = std::make_shared<VolumeControl>();
	}

	// 播放音乐
	void PlayMusic(const std::string& _filePath)
	{
		//解码
		audioCodec_->LoadAudioFile(_filePath);

		// 缓存
		audioCache_->CreateCache(audioCodec_->GetCodecResult());

		// 设置音量
		volumeControl_->SetVolume(3);

		// 播放音乐
		audioCache_->Play();
	}

private:

	// 音频解码
	std::shared_ptr<AudioCodec> audioCodec_;

	// 音频缓存
	std::shared_ptr<AudioCache> audioCache_;

	// 音量控制
	std::shared_ptr<VolumeControl> volumeControl_;
};

测试:

void TestFacade()
{
	std::shared_ptr<MusicPlayerFacade> musicPlay = std::make_shared<MusicPlayerFacade>();

	musicPlay->PlayMusic("D:/素颜.mp4");
}

在这个门面类中,我们创建了三个子系统的对象(音频缓存、音频解码、音量控制),并且封装了一个PlayMusic方法来简化客户端的调用。当客户端要播放某个音乐文件时,只需要调用PlayMusic方法传入文件路径和音量参数就可以了,门面类只负责各个子系统的调用过程。

使用门面模式,客户端只需要与门面类交互,而不用直接与子系统的各个组件交互,这样降低了客户端代码与子系统的耦合度。同时,如果我们需要更改子系统的实现,只需要修改门面类中的代码即可,不会影响到客户端的代码。

门面模式遵循以下设计原则:

1、单一职责原则:门面模式将多个子系统的复杂功能封装在一个门面类中,让客户端只需要与门面类交互,从而将职责单一化。

2、迪米特法则:门面模式将客户端与子系统分离,客户端只需要直接与门面类交互,而不需要了解子系统的具体实现细节。从而降低了类与类之间的耦合度,提高了系统的可维护性。

3、开闭原则:门面模式通过增加门面类中新的方法或扩展子系统类来实现对系统的修改,而只需要对门面类进行修改,不需要对客户端进行修改,从而满足开闭原则。

4、依赖倒置原则:门面模式遵循了依赖倒置原则,客户端只依赖于门面类,而不依赖于子系统类,从而减少了客户端与子系统之间的依赖关系,系统的耦合度降低,也提高了系统的灵活性和可扩展性。


http://www.kler.cn/news/148830.html

相关文章:

  • java中IO知识点概念
  • GoLong的学习之路,进阶,RabbitMQ (消息队列)
  • Jmeter-分布式压测(远程启动服务器,windows)
  • 代码随想录-刷题第九天
  • 通义千问 Qwen-7B-Chat-Int4 模型本地化部署
  • 机器人规划算法——movebase导航框架源码分析
  • Linux的软件安装
  • linaro交叉编译工具链下载与使用笔记
  • Nacos 端口偏移量说明
  • java文件上传以及使用阿里云OSS
  • 【ArcGIS Pro微课1000例】0038:基于ArcGIS Pro的人口密度分析与制图
  • 11 动态规划解最后一块石头的重量II
  • TiDB 在咪咕云原生场景下的实践
  • 人工智能原理复习--知识表示(一)
  • 图论 2023.11.27
  • springboot 自定义starter逐级抽取
  • MATLAB算法实战应用案例精讲-【图像处理】FPGA
  • 编写安全 JavaScript 代码的最佳实践
  • Gossip协议理解
  • Android控件全解手册 - 任意View缩放平移工具-实现思路和讲解
  • 京东大数据(京东运营数据采集):2023年10月京东牛奶乳品行业品牌销售排行榜
  • 解决:SyntaxError: Non-UTF-8 code starting with À in file but no encoding declared
  • pgsql分别获取日期中的年、月、日,并处理前台展示有小数点的情况
  • STM32CubeIDE(ADC)
  • C++面试,说明const和#define的特点和区别
  • 基于单片机的智能饮水机控制系统(论文+源码)
  • JAVA进阶之路JVM-2:类加载机制,类的生命周期,类加载过程,类加载时机,类加载器,双亲委派模型,对象创建过程
  • LuatOS-SOC接口文档(air780E)--rtc - 实时时钟
  • uniapp微信小程序中阻止事件冒泡
  • 如何根据接口文档,轻松快速的模拟接口服务?