6、C++设计模式——适配器模式(菜鸟教程例子)
原例网址:适配器模式(菜鸟教程)
适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。
1 #include "iostream" 2 #include "string" 3 using namespace std; 4 5 6 7 //步骤1 为媒体播放器和更高级的媒体播放器创建接口 8 class MediaPlayer 9 { 10 public: 11 virtual void play(string audioType, string fileName) = 0; 12 }; 13 14 class AdvancedMediaPlayer 15 { 16 public: 17 virtual void playVlc(string fileName) = 0; 18 virtual void playMp4(string fileName) = 0; 19 }; 20 21 22 23 //步骤2 创建实现了 AdvancedMediaPlayer 接口的实体类 24 class VlcPlayer : public AdvancedMediaPlayer 25 { 26 public: 27 void playVlc(string fileName) 28 { 29 cout << "Playing vlc file. Name: " << fileName << endl; 30 } 31 void playMp4(string fileName) 32 { 33 //什么也不做 34 } 35 }; 36 37 class Mp4Player : public AdvancedMediaPlayer 38 { 39 public: 40 void playVlc(string fileName) 41 { 42 //什么也不做 43 } 44 void playMp4(string fileName) 45 { 46 cout << "Playing mp4 file. Name: " << fileName << endl; 47 } 48 }; 49 50 51 52 //步骤3 创建实现了 MediaPlayer 接口的适配器类 53 class MediaAdapter : public MediaPlayer 54 { 55 public: 56 MediaAdapter(string audioType) //构造函数 57 { 58 if ( audioType == "vlc" ) 59 advancedMusicPlayer = new VlcPlayer(); 60 else if ( audioType == "mp4" ) 61 advancedMusicPlayer = new Mp4Player(); 62 else 63 cout << "未知audioType" << endl; 64 } 65 66 void play(string audioType, string fileName) 67 { 68 if ( audioType == "vlc" ) 69 advancedMusicPlayer->playVlc(fileName); 70 else if ( audioType == "mp4" ) 71 advancedMusicPlayer->playMp4(fileName); 72 else 73 cout << "未知audioType" << endl; 74 } 75 private: 76 AdvancedMediaPlayer* advancedMusicPlayer; 77 }; 78 79 80 81 //步骤4 创建实现了 MediaPlayer 接口的实体类 82 class AudioPlayer : public MediaPlayer 83 { 84 public: 85 void play(string audioType, string fileName) 86 { 87 //播放 mp3 音乐文件的内置支持 88 if ( audioType == "mp3" ) { 89 cout << "Playing mp3 file. Name: " << fileName << endl; 90 } 91 //mediaAdapter 提供了播放其他文件格式的支持 92 else if ( ( audioType == "vlc" ) || ( audioType == "mp4" ) ) { 93 mediaAdapter = new MediaAdapter(audioType); 94 mediaAdapter->play(audioType, fileName); 95 } 96 else { 97 cout << "未知audioType" << endl; 98 } 99 } 100 101 private: 102 MediaAdapter* mediaAdapter; 103 }; 104 105 106 107 //步骤5 使用 AudioPlayer 来播放不同类型的音频格式 108 void main() 109 { 110 AudioPlayer* audioPlayer = new AudioPlayer(); 111 112 audioPlayer->play("mp3","beyond the horizon.mp3"); 113 audioPlayer->play("mp4","alone.mp4"); 114 audioPlayer->play("vlc", "far far away.vlc"); 115 audioPlayer->play("avi", "mind me.avi"); 116 117 delete audioPlayer; 118 audioPlayer = NULL; 119 120 system("pause"); 121 }
运行结果:
分类:
学习C++设计模式(菜鸟教程)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具