1.简介
适配器模式(Adapter Pattern)是一种结构型设计模式,旨在将一个类的接口转换为客户端希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。简单来说,它就像一个“适配器”,可以让本来不兼容的插头和插座之间建立联系。
2.通俗讲解
假设你有一个老式的播放器,它只能播放MP3格式的文件,但现在你有一个新的音频库,它只提供播放AAC格式文件的功能。如果你不想修改播放器的代码,但又希望它能播放AAC格式的文件,那么适配器模式就派上用场了。
3.实战
3.1.代码
我们可以创建一个适配器类,将新的音频库的AAC播放功能包装起来,让它看起来像是一个MP3播放器。
#include <stdio.h>
// 旧播放器接口,支持播放MP3格式文件
typedef struct {
void (*playMP3)(const char* filename);
} MP3Player;
// 新音频库接口,支持播放AAC格式文件
typedef struct {
void (*playAAC)(const char* filename);
} AACPlayer;
// 实现AAC播放功能
void playAACFile(const char* filename) {
printf("Playing AAC file: %s\n", filename);
}
// 创建一个适配器,使得AACPlayer看起来像MP3Player
typedef struct {
MP3Player mp3Player;
AACPlayer* aacPlayer;
} MP3ToAACAdapter;
// 适配器的播放方法
void playMP3UsingAdapter(const char* filename) {
printf("Adapter converting MP3 request to AAC format...\n");
MP3ToAACAdapter* adapter = (MP3ToAACAdapter*)filename; // 注意:实际使用中,这种转换应通过上下文来完成,此处为简化示例
adapter->aacPlayer->playAAC(filename);
}
int main() {
// 创建AAC播放器实例
AACPlayer aacPlayer = { playAACFile };
// 创建适配器,将AAC播放器包装成MP3播放器
MP3ToAACAdapter adapter = { { playMP3UsingAdapter }, &aacPlayer };
// 使用适配器播放文件
adapter.mp3Player.playMP3("example.aac");
return 0;
}
3.2.代码解析
- MP3Player 和 AACPlayer 结构体:它们分别代表了旧的播放器接口(MP3格式)和新的音频库接口(AAC格式)。每个结构体中都有一个函数指针,指向相应的播放函数。
- playAACFile 函数:这是新音频库中实现的播放AAC文件的功能。它只是简单地打印出播放的文件名。
- MP3ToAACAdapter 结构体:这是适配器。它包含了一个 MP3Player 实例和一个指向 AACPlayer 的指针。这个结构体的作用是将 MP3Player 的接口请求转换为 AACPlayer 的接口调用。
- playMP3UsingAdapter 函数:适配器的核心函数。在这里,它将 MP3Player 接口的播放请求转换为 AACPlayer 接口的调用,并输出一条提示信息。
- main 函数:在主函数中,创建了一个 AACPlayer 实例,并用适配器将其包装成 MP3Player。最后,通过适配器播放一个AAC格式的文件。
3.3.代码运行
- 创建了一个 AACPlayer 实例,绑定了 playAACFile 函数。
- 使用适配器将 AACPlayer 实例包装成 MP3Player,适配器将 MP3Player 的播放请求转换为 AACPlayer 的调用。
- 当调用 MP3Player 的 playMP3 方法时,适配器将这个调用转发给 AACPlayer 的 playAAC 方法。
执行程序后,输出将如下所示:
Adapter converting MP3 request to AAC format...
Playing AAC file: example.aac
3.4.结果分析
-
Adapter converting MP3 request to AAC format…:这表明适配器成功拦截了 MP3Player 的播放请求,并准备将其转换为 AAC 播放请求。
-
Playing AAC file: example.aac:适配器成功地调用了 AACPlayer 的 playAAC 方法,最终播放了AAC格式的文件。
通过这种方式,旧的播放器接口成功地兼容了新的音频格式,而不需要对播放器本身进行修改。这正是适配器模式的核心优势所在。