设计模式——适配器模式(C++实现)

本文深入探讨了适配器模式的原理与应用,通过实例演示如何解决不同接口间的兼容问题,适用于希望复用已有类或使类能与其他不相关类协同工作的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适配器模式简介

  1.  作为两个不兼容接口之间的桥梁,结合了两个独立接口的功能,处于结构型模式
  2. 在下列三种情景下可以使用适配器模式:
    1. 使用一个已存在的类,但其接口不符合要求
    2. 创建一个复用的类,该类可以与其他不相关的类或不可预见的类协同工作
    3. 使用一个已存在的子类,但不能对每一都进行子类化以匹配它们的接口,对象适配器可以适配它的父类接口。

 

采用菜鸟教程适配器模式的例子,这里用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上运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值