1.实现思路:
有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。
想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式。
2.代码:
#include <iostream>
#include <string>
using namespace std;
//需要适配的接口
class AdvancedMediaPlayer
{
public:
virtual void PlayVlc(string fileName)=0;
virtual void PlayMp4(string fileName) = 0;
};
class VlcPlayer :public AdvancedMediaPlayer {
public:
virtual void PlayVlc(string fileName) {
cout << "Playing vlc fileName:" << fileName << endl;
}
virtual void PlayMp4(string fileName)
{
//只为了同一接口,此功能不做
}
};
class Mp4Player :public AdvancedMediaPlayer {
public:
virtual void PlayVlc(string fileName) {
//只为了同一接口,此功能不做
}
virtual void PlayMp4(string fileName)
{
cout << "Playing Mp4 fileName:" << fileName << endl;
}
};
//默认接口
class MediaPlayer {
virtual void Play(string audioType, string fileName) = 0;
};
//适配器类
class MediaAdapter :public MediaPlayer {
private:
AdvancedMediaPlayer* m_advanceMediaPlayer;
public:
MediaAdapter(string audioType)
{
if (audioType == "vlc")
{
m_advanceMediaPlayer = new VlcPlayer();
}
else if (audioType == "mp4")
{
m_advanceMediaPlayer = new Mp4Player();
}
}
virtual void Play(string audioType, string fileName) override {
if (audioType == "vlc")
{
m_advanceMediaPlayer->PlayVlc(fileName);
}
else if (audioType == "mp4")
{
m_advanceMediaPlayer->PlayMp4(fileName);
}
}
};
class AudioPlayer :public MediaPlayer {
public:
virtual void Play(string audioType, string fileName) override {
if (audioType == "mp3")
{
cout << "Playing Mp3 fileName:" << fileName << endl;
}
else if(audioType=="mp4"||audioType=="vlc")
{
m_adapter = new MediaAdapter(audioType);
m_adapter->Play(audioType,fileName);
}
else
{
cout << " not play fileName:" << fileName << endl;
}
}
private:
MediaAdapter* m_adapter;
};
int main()
{
AudioPlayer player;
player.Play("mp4", "test01");
player.Play("mp3", "test02");
player.Play("vlc", "test03");
player.Play("avi", "test04");
}