意图:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
使用场景
1、当使用一个已经存在的类时,而它的接口不符合你的需求
2、创建一个可以复用的类,并且该类可以与其他不相关的类或不可预见的类协同工作
3、对于对象适配器向使用其已经存在的子类
优缺点
优点:
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,
其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果
不是很有必要,可以不使用适配器,而是直接对系统进行重构。
UML结构(源于菜鸟教程中使用java实现适配器的UML图)
/*
* @Description:
* @Author: ysq
* @Date: 2020-06-11 23:40:58
* @LastEditTime: 2020-06-12 20:00:01
* @LastEditors: ysq
*/
#include <iostream>
#include <string.h>
using namespace std;
class AdvancedMediaPlayer
{
public:
AdvancedMediaPlayer(){}
virtual ~AdvancedMediaPlayer(){}
virtual void playVlc(std::string Filename) = 0;
virtual void playMp4(std::string Filename) = 0;
};
class VlcPlayer : public AdvancedMediaPlayer
{
public:
VlcPlayer(){}
~VlcPlayer(){}
void playVlc(std::string Filename)
{
cout << "play VLC filename is " << Filename << endl;
}
void playMp4(std::string Filename){}
};
class Mp4Player : public AdvancedMediaPlayer
{
public:
Mp4Player(){}
~Mp4Player(){}
void playVlc(std::string Filename){}
void playMp4(std::string Filename)
{
cout << "play Mp4 filename is " << Filename << endl;
}
};
class MediaPlayer
{
public:
MediaPlayer(){}
virtual ~MediaPlayer(){}
virtual void play(std::string audioType, std::string Filename) = 0;
};
class MediaAdapter : public MediaPlayer
{
public:
MediaAdapter(){}
~MediaAdapter()
{
if(advancemediaplayer != nullptr)
{
delete advancemediaplayer;
advancemediaplayer = nullptr;
cout << "advancemediaplayer is delete " << endl;
}
}
void play(std::string audioType, std::string Filename)
{
if (audioType == "Mp4")
{
advancemediaplayer = new Mp4Player();
advancemediaplayer->playMp4(Filename);
}
if (audioType == "vlc")
{
advancemediaplayer = new VlcPlayer();
advancemediaplayer->playVlc(Filename);
}
}
private:
AdvancedMediaPlayer *advancemediaplayer;
};
class AudioPlayer : public MediaPlayer
{
public:
AudioPlayer(){}
~AudioPlayer()
{
if(mediaadapter != nullptr)
{
delete mediaadapter;
mediaadapter = nullptr;
}
}
void play(std::string audioType, std::string Filename)
{
if (audioType == "mp3")
{
cout << "mp3 file is support Filename" << Filename << endl;
}
else if (audioType == "Mp4" || audioType == "vlc")
{
mediaadapter = new MediaAdapter();
mediaadapter->play(audioType, Filename);
}
else
{
cout << Filename << "file is not support" << endl;
}
}
private:
MediaAdapter *mediaadapter;
};
int main()
{
AudioPlayer *audio = new AudioPlayer();
audio->play("mp3", "mp3 file");
audio->play("Mp4", "Mp4 file");
audio->play("vlc", "vlc file");
audio->play("m4a", "m4a file");
//media->~MediaAdapter();
return 0;
}