1、介绍
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许一个类的接口与另一个不兼容的接口协同工作。适配器模式主要解决的是接口不兼容的问题,通过将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的接口能够协同工作。
适配器模式主要包含三种角色:
(1)目标接口(Target):客户端所期望的接口。目标接口可以是抽象类或接口,定义客户端期望的方法。
(2)适配者(Adaptee):现有需要适配的接口。适配者通常是一个已经存在的类,其接口不符合客户端的期望。
(3)适配器(Adapter):适配器类是适配器模式的核心。适配器将客户端的请求转换为对适配者的相应接口的调用。适配器可以是抽象类的子类,也可以是接口的实现类。适配器通过继承或持有适配者的方式,实现目标接口并调用适配者的方法。
2、示例
假设有一个旧的LegacyMediaPlayer
类,它有一个playOldFormat(const std::string& file)
方法用于播放老格式的音乐文件。现在,想让它兼容一个新的接口MediaPlayer
,该接口有一个play(const std::string& file)
方法。
定义新的MediaPlayer
接口和旧的LegacyMediaPlayer
类;创建一个适配器类MediaAdapter
,它继承自MediaPlayer
接口并持有一个LegacyMediaPlayer
对象。在适配器中,可以实现play
方法,该方法调用LegacyMediaPlayer
的playOldFormat
方法。客户端代码可以使用新的MediaPlayer
接口来播放音乐,而不需要关注底层实现细节。
#include <iostream>
// 新的MediaPlayer接口
class MediaPlayer {
public:
virtual ~MediaPlayer() = default;
virtual void play(const std::string& file) = 0;
};
// 旧的LegacyMediaPlayer类
class LegacyMediaPlayer {
public:
void playOldFormat(const std::string& file) {
// 假设这里实现了播放老格式文件的逻辑
std::cout << "Playing old format: " << file << std::endl;
}
};
// 适配器类
class MediaAdapter : public MediaPlayer {
private:
LegacyMediaPlayer legacyPlayer;
public:
void play(const std::string& file) override {
legacyPlayer.playOldFormat(file);
}
};
int main() {
MediaPlayer* player = new MediaAdapter(); // 使用适配器
player->play("some_old_format_file.mp2"); // 播放老格式文件
delete player; // 释放资源
return 0;
}
结果:
Playing old format: some_old_format_file.mp2