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