#include<iostream>
#include<string>
class MediaPlayer{
public:
virtual void play(const std::string& type) = 0;
};
class AdvancedPlayer{
public:
virtual void playMP4()const = 0;
virtual void playVLC()const = 0;
};
class MP4Player : public AdvancedPlayer{
public:
void playMP4()const override
{
std::cout << "play mp4..." << std::endl;
}
void playVLC()const override
{
}
};
class VLCPlayer : public AdvancedPlayer{
public:
void playVLC()const override
{
std::cout << "play vlc..." << std::endl;
}
void playMP4()const override
{
}
};
class MediaAdapter : public MediaPlayer{
private:
AdvancedPlayer* m_advancedPlayer;
public:
MediaAdapter(const std::string& type)
{
if(type == "mp4"){
m_advancedPlayer = new MP4Player;
}
else if(type == "vlc"){
m_advancedPlayer = new VLCPlayer;
}
}
~MediaAdapter()
{
delete m_advancedPlayer;
}
void play(const std::string& type)override
{
if(type == "mp4"){
m_advancedPlayer->playMP4();
}
else if(type == "vlc"){
m_advancedPlayer->playVLC();
}
}
};
class Player : public MediaPlayer{
private:
MediaAdapter *adapter;
public:
void play(const std::string& type)override
{
if(type == "mp3"){
std::cout << "play mp3..." << std::endl;
}
else if(type == "mp4" || type == "vlc"){
adapter = new MediaAdapter(type);
adapter->play(type);
}
else{
std::cout << "invalid media format!" << std::endl;
}
}
~Player()
{
if(adapter){
delete adapter;
}
}
};
void client(Player& player)
{
player.play("vlc");
player.play("mp3");
player.play("mp4");
player.play("avi");
}
int main()
{
Player player;
client(player);
return 0;
}