适配器模式简介
- 作为两个不兼容接口之间的桥梁,结合了两个独立接口的功能,处于结构型模式
- 在下列三种情景下可以使用适配器模式:
- 使用一个已存在的类,但其接口不符合要求
- 创建一个复用的类,该类可以与其他不相关的类或不可预见的类协同工作
- 使用一个已存在的子类,但不能对每一都进行子类化以匹配它们的接口,对象适配器可以适配它的父类接口。
采用菜鸟教程适配器模式的例子,这里用C++实现
#include<iostream>
#include<string>
using namespace std;
//创建一个媒体播放器抽象基类 本身可以播放MP3格式文件
class MediaPlayer
{
public:
MediaPlayer() {};
virtual ~MediaPlayer() {};
virtual void play(string audiotype, string filename)=0;
};
//创建一个高级媒体播放器抽象基类 可以播放vlc和mp4格式文件
class AdvancedMediaPlayer
{
public:
AdvancedMediaPlayer() {};
virtual ~AdvancedMediaPlayer() {};
virtual void playVlc(string fileName)=0;
virtual void playMp4(string fileName)=0;
};
//创建一个可以播放vlc格式的播放器继承高级媒体播放器
class VlcPlayer : public AdvancedMediaPlayer
{
public:
VlcPlayer() {};
~VlcPlayer() {};
void playVlc(string fileName);
void playMp4(string fileName) {};
};
void VlcPlayer::playVlc(string fileName)
{
cout << "VlcPlayer class: playVlc: " << fileName << endl;
}
//创建一个可以播放mp4格式的播放器继承高级媒体播放器
class Mp4Player : public AdvancedMediaPlayer
{
public:
Mp4Player() {};
~Mp4Player() {};
void playMp4(string fileName);
void playVlc(string fileName) {};
};
void Mp4Player::playMp4(string fileName)
{
cout << "Mp4Player class: playMp4: " << fileName << endl;
}
//创建一个媒体播放器的适配器,继承媒体播放器抽象基类,使其可以播放vlc和mp4格式文件
class MediaAdapter :public MediaPlayer
{
public:
MediaAdapter(string audiotype);
~MediaAdapter();
void play(string audiotype, string filename);
private:
AdvancedMediaPlayer *admeplayer;
};
MediaAdapter::MediaAdapter(string audiotype)
{
if("vlc"== audiotype)
{
admeplayer = (AdvancedMediaPlayer*)new VlcPlayer();
}
else if ("mp4" == audiotype)
{
admeplayer = (AdvancedMediaPlayer*)new Mp4Player();
}
}
MediaAdapter::~MediaAdapter()
{
delete admeplayer;
admeplayer = NULL;
}
void MediaAdapter::play(string audiotype, string filename)
{
if ("vlc" == audiotype)
{
admeplayer->playVlc(filename);
}
else if ("mp4" == audiotype)
{
admeplayer->playMp4(filename);
}
else
{
cout<<"no audiotype: "<< audiotype<<" to play "<<filename<<endl;
}
}
//创建一个音乐播放器类,继承媒体播放器抽象基类,同时包含媒体播放器适配器类,使其可以播放多种格式的文件
class AudioPlayer :public MediaPlayer
{
public:
AudioPlayer() {};
~AudioPlayer();
void play(string audiotype, string filename);
private:
MediaAdapter *meadapter;
};
AudioPlayer::~AudioPlayer()
{
delete meadapter;
meadapter = NULL;
}
void AudioPlayer::play(string audiotype, string filename)
{
if ("mp3" == audiotype)
{
cout << "play mp3 type : " << filename << endl;
}
else if ("mp4" == audiotype || "vlc" == audiotype)
{
meadapter = new MediaAdapter(audiotype);
meadapter->play(audiotype, filename);
}
else
{
cout << "no audiotype: " << audiotype << " to play " << filename << endl;
}
}
int main()
{
AudioPlayer *t1=new AudioPlayer();
t1->play("mp3", "t1.mp3");
t1->play("vlc", "t1.vlc");
t1->play("mp4", "t1.mp4");
t1->play("avi", "t1.avi");
delete t1;
system("pause");
return 0;
}
在visual studio 2015上运行结果: